Создание HTTP и запросов HTTPS
OS X и iOS обеспечивают много APIs общего назначения для того, чтобы сделать HTTP и Запросы HTTPS. С этим APIs можно загрузить файлы на диск, сделать простой HTTP и Запросы HTTPS, или точно настроить запрос на определенные требования серверной инфраструктуры.
При выборе API необходимо сначала рассмотреть, почему Вы делаете Запрос HTTP:
Если Вы пишете приложение Киоска, необходимо использовать
NKAssetDownload
API для загрузки содержания в фоновом режиме.Если необходимо загрузить файл на диск в OS X, самый простой путь состоит в том, чтобы использовать
NSURLDownload
класс. Для получения дополнительной информации посмотрите Файлы Загрузки к Диску.Необходимо использовать
CFHTTPStream
если какое-либо следующее является истиной:У Вас есть строгое требование для не использования Objective C.
Необходимо переопределить настройки прокси.
Необходимо быть совместимы с определенным несовместимым сервером.
Для получения дополнительной информации посмотрите, что Запросы Создания Используют Базовую Основу.
Иначе, необходимо обычно использовать
NSURLSession
илиNSURLConnection
APIs.
Разделы ниже описывают этот APIs более подробно.
Создание запросов Используя основу
Следующие задачи описывают общие операции с NSURLSession
класс, NSURLConnection
класс и связанные классы.
Получение содержания URL без делегатов
Если просто необходимо получить содержание URL и сделать что-то с результатами в конце в OS X v10.9 и позже или iOS 7 и позже, необходимо использовать NSURLSession
класс. Можно также использовать NSURLConnection
класс для совместимости с более ранними версиями OS X и iOS.
Чтобы сделать это, вызовите один из следующих методов: dataTaskWithRequest:completionHandler:
(NSURLSession
), dataTaskWithURL:completionHandler:
(NSURLSession
), или sendAsynchronousRequest:queue:completionHandler:
(NSURLConnection
). Ваше приложение должно предоставить следующую информацию:
Как надлежащий, любой
NSURL
возразите или заполненныйNSURLRequest
объект, обеспечивающий URL, данные организации и любую другую информацию, которая могла бы быть запрошена для Вашего определенного запроса.Блок обработчика завершения, работающий каждый раз, когда концы передачи или сбои.
Для
NSURLConnection
,NSOperation
очередь, на которой должен работать Ваш блок.
Если передача успешно выполняется, содержание запроса передается блоку обработчика обратного вызова как NSData
возразите и NSURLResponse
объект для запроса. Если загрузочная система URL неспособна получить содержание URL, NSError
объект передается как третий параметр.
Получение содержания URL с делегатами
Если для Вашего приложения нужно больше управления Вашим запросом, таким как управление, сопровождаются ли перенаправления, выполняя пользовательскую аутентификацию, или получая данные, кусочные, поскольку это получено, можно использовать NSURLSession
класс с пользовательским делегатом. Для совместимости с более ранними версиями OS X и iOS, можно также использовать NSURLConnection
класс с пользовательским делегатом.
По большей части, NSURLSession
и NSURLConnection
классы работают так же на высоком уровне. Однако существует несколько существенных различий:
NSURLSession
API предоставляет поддержку для задач загрузки, ведущих себя во многом какNSURLDownload
класс. Это использование описано далее в Загрузке Файлов к Диску.Когда Вы создаете
NSURLSession
объект, Вы обеспечиваете допускающий повторное использование объект конфигурации, инкапсулирующий много общих параметров конфигурации. СNSURLConnection
, необходимо установить те опции на каждом соединении независимо.NSURLConnection
объект обрабатывает единственный запрос и любые последующие запросы.NSURLSession
объект управляет многократными задачами, каждая из которых представляет единственный URL-запрос и любые последующие запросы. Вы обычно создаете сеанс, когда Ваше приложение запускается, затем создайте задачи почти таким же способом, которым Вы создали быNSURLConnection
объекты.С
NSURLConnection
, каждый объект соединения имеет отдельного делегата. СNSURLSession
, делегат совместно используется через все задачи в сеансе. Если необходимо использовать различного делегата, необходимо создать новый сеанс.
Когда Вы инициализируете NSURLSession
или NSURLConnection
объект, соединение или сеанс автоматически планируются в текущем цикле выполнения в выполненном режиме цикла по умолчанию.
Делегат, которого Вы предоставляете, получает уведомления в течение процесса соединения, включая неустойчивые вызовы к URLSession:dataTask:didReceiveData:
или connection:didReceiveData:
метод, когда соединение получает дополнительные данные от сервера. Это - ответственность делегата отслеживать данные, которые это уже получило, при необходимости. Как правило:
Если данные могут быть обработаны часть за один раз, сделайте так. Например, Вы могли бы использовать потоковую передачу синтаксический анализатор XML.
Если данные являются маленькими, Вы могли бы добавить их к
NSMutableData
объект.Если данные являются большими, необходимо записать его в файл и обработать их после завершения передачи.
Когда URLSession:task:didCompleteWithError:
или connectionDidFinishLoading:
метод вызывают, делегат получил полноту содержания URL’s.
Загрузка содержания URL к диску
В OS X v10.9 и позже или iOS 7 и позже, если необходимо загрузить URL и сохранить результаты как файл, но не должны обрабатывать данные в рейсе, NSURLSession
класс позволяет Вам загрузить URL непосредственно на файл на диске на единственном шаге (в противоположность загрузке URL в память и затем запись его самим). NSURLSession
в то время как приложение приостановлено, разрушено, или иначе не выполнение, класс также позволяет Вам приостанавливать и возобновлять загрузки, перезапускать отказавшие загрузки, и продолжать загружать.
В iOS, NSURLSession
класс также запускает Ваше приложение в фоновом режиме каждый раз, когда загрузка заканчивается так, чтобы можно было выполнить любую специфичную для приложения обработку на файле.
Использовать NSURLSession
класс для загрузки, Ваш код должен сделать следующее:
Создайте сеанс с пользовательским делегатом и объектом конфигурации по Вашему выбору:
Если Вы хотите, чтобы загрузки продолжались, в то время как Ваше приложение не работает, необходимо обеспечить фоновый объект конфигурации сеанса (с уникальным идентификатором) при создании сеанса.
Если Вы не заботитесь о фоновой загрузке, можно создать сеанс с помощью любых из предоставленных типов объектов конфигурации сеанса.
Создайте и возобновите одну или более задач загрузки в сеансе.
Ожидайте, пока Ваш делегат не получит вызовы от задачи или сеанса. В частности необходимо реализовать
URLSession:downloadTask:didFinishDownloadingToURL:
метод, чтобы сделать что-то с файлом, когда загрузка заканчивается иURLSession:task:didCompleteWithError:
вызовите для обработки любых ошибок.
Подача с запросом POST
Можно сделать HTTP или HTTPS запросом POST почти тем же способом, которым Вы сделали бы любой другой URL-запрос (описанным в Получении Содержания URL с Делегатами). Основное различие - то, что необходимо сначала сконфигурировать NSMutableURLRequest
объект Вы обеспечиваете для initWithRequest:delegate:
метод.
Также необходимо создать данные организации. Можно сделать это одним из трех способов:
Для загрузки коротких, данных в памяти Вы должны URL - кодировать существующую часть данных. Этот процесс описан в Кодировании Данных URL.
Для загрузки данных файла от диска вызовите
setHTTPBodyStream:
метод для сообщенияNSMutableURLRequest
читать изNSInputStream
и используйте получающиеся данные в качестве содержания организации.Для больших блоков созданных данных вызвать
CFStreamCreateBoundPair
для создания пары потоков затем вызовитеsetHTTPBodyStream:
метод для сообщенияNSMutableURLRequest
использовать один из тех потоков как источник для его содержания организации. Путем записи в другой поток можно отправить данным часть за один раз.В зависимости от того, как Вы обрабатываете вещи на серверной стороне, можно также хотеть к URL - кодируют данные, которые Вы отправляете.)
Для указания различного типа контента для запроса используйте setValue:forHTTPHeaderField:
метод. Если Вы делаете, удостоверьтесь, что Ваши данные организации должным образом отформатированы для того типа контента.
Для получения оценки прогресса для запроса POST реализуйте a connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
метод в делегате соединения.
Конфигурирование аутентификации
Выполнение аутентификации с NSURLSession
и NSURLConnection
является относительно прямым. Путем Вы делаете это зависит от класса, который Вы используете и от версии OS X или iOS, для которого Вы предназначаетесь.
Для NSURLSession
класс, Ваш делегат должен реализовать URLSession:task:didReceiveChallenge:completionHandler:
метод. В этом методе Вы выполняете любые операции, необходимы, чтобы определить, как ответить на вызов, затем вызовите предоставленный обработчик завершения с константой, указывающей, как Загрузочная система URL должна продолжиться и, дополнительно, учетные данные для использования в целях аутентификации.
Для NSURLConnection
класс:
В OS X v10.7 и более новый или iOS 5 и более новый, Ваш делегат должен реализовать
connection:willSendRequestForAuthenticationChallenge:
метод. Этот метод должен вызвать метод на отправителе (NSURLConnection
объект) для сообщения его, как продолжить.В более ранних версиях Ваш делегат должен реализовать обоих
connection:canAuthenticateAgainstProtectionSpace:
иconnection:didReceiveAuthenticationChallenge:
методы.connection:didReceiveAuthenticationChallenge:
метод эквивалентенconnection:willSendRequestForAuthenticationChallenge:
метод в более поздних версиях и вызовы метод на отправителе (NSURLConnection
объект) для сообщения его, как продолжить.connection:canAuthenticateAgainstProtectionSpace:
метод должен возвратитьсяYES
если[protectionSpace authenticationMethod]
любой изNSURLAuthenticationMethodDefault
,NSURLAuthenticationMethodHTTPBasic
,NSURLAuthenticationMethodHTTPDigest
,NSURLAuthenticationMethodHTMLForm
,NSURLAuthenticationMethodNegotiate
, илиNSURLAuthenticationMethodNTLM
.
Возможные ответы на запрос аутентификации
Независимо от которого класса Вы используете, Ваш метод обработчиков аутентификации должен исследовать запрос аутентификации и сказать Загрузочную систему URL, как продолжить:
Обеспечить учетные данные для аутентификации, передачи
NSURLSessionAuthChallengeUseCredential
как расположение (дляNSURLSession
) или вызовитеuseCredential:forAuthenticationChallenge:
(дляNSURLConnection
).Для получения информации о создании учетного объекта считайте Создание Учетного Объекта.
Продолжать запрос, не обеспечивая аутентификацию, передачу
NSURLSessionAuthChallengeUseCredential
как расположение с anil
учетные данные (дляNSURLSession
) или вызовитеcontinueWithoutCredentialForAuthenticationChallenge:
(дляNSURLConnection
).Отменять запрос аутентификации, передачу
NSURLSessionAuthChallengeCancelAuthenticationChallenge
как расположение (дляNSURLSession
) или вызовитеcancelAuthenticationChallenge:
(дляNSURLConnection
). При отмене запроса аутентификации потоковый ошибочный метод делегата вызывают.Чтобы сказать операционной системе обрабатывать проблему как, его обычно был бы, передача
NSURLSessionAuthChallengePerformDefaultHandling
как расположение (дляNSURLSession
) или вызовитеperformDefaultHandlingForAuthenticationChallenge:
(дляNSURLConnection
). Если Вы запрашиваете обработку по умолчанию, то операционная система отправляет любые надлежащие учетные данные, существующие в кэше учетных данных.Отклонить определенный тип аутентификации во время процесса согласования, с намерением принять различный метод, передачу
NSURLSessionAuthChallengeRejectProtectionSpace
как расположение (дляNSURLSession
) или вызовитеrejectProtectionSpaceAndContinueWithChallenge:
(дляNSURLConnection
).
Создание учетного объекта
В Вашем делегате connection:willSendRequestForAuthenticationChallenge:
или connection:didReceiveAuthenticationChallenge:
метод, Вы, возможно, должны обеспечить NSURLCredential
объект, обеспечивающий фактическую информацию аутентификации.
Для простого входа в систему/аутентификации по паролю вызвать
credentialWithUser:password:persistence:
.Для основанной на сертификате аутентификации вызвать
credentialWithIdentity:certificates:persistence:
с aSecIdentityRef
объект (который обычно получается из цепочки для ключей пользователя путем вызоваSecItemCopyMatching
).
Дополнительная информация
Узнать больше NSURLSession
API, считайте Руководство по программированию Загрузочной системы URL. Для связанного примера кода посмотрите SimpleURLConnections, AdvancedURLConnections, и Используя NSXMLParser для парсинга XML-документов.
Для получения дополнительной информации о NSURLConnection
API, считайте Руководство по программированию Загрузочной системы URL.
Узнать больше об использовании NSStream
API для того, чтобы сделать Запросы HTTP, считайте Установку Потоков Сокета в Потоковом Руководстве по программированию.
Для примера setHTTPBodyStream:
метод и CFStreamCreateBoundPair
функционируйте, посмотрите SimpleURLConnections в библиотеке iOS. (Выборка в целом разработана, чтобы создать и работать на iOS, но сетевые части кода также полезны на OS X.)
Создание запросов Используя базовую основу
Кроме подробных данных синтаксиса, функциональность запроса в Базовой Основе тесно связана с тем, что доступно на уровне Foundation. Таким образом примеры в Создании Запросов Используя Основу должны быть полезными в понимании, как выполнить запросы с помощью CFHTTPStream
API.
Базовые Утилиты Доступа через URL Основы являются языком C API, который является частью Базовой платформы Основы. Для узнавания больше считайте Базовую Ссылку Утилит Доступа через URL Основы.
CFHTTPStream
API является языком C API, который является частью Базовой платформы Основы. (Можно, конечно, использовать его в коде Objective C.) Для узнавания больше считайте Связь с Серверами HTTP и Связь с Аутентификацией Серверов HTTP в Руководстве по программированию CFNetwork.
Этот APIs является самым гибким способом связаться с сервером HTTP (за исключением использования сокетов или потоков сокета непосредственно), обеспечивая полный контроль над телом сообщения, как отправлено в удаленный сервер и управление большинством заголовков сообщения также. Этот APIs также более сложен, и таким образом должен использоваться, только если высокоуровневый APIs не может поддерживать Ваши потребности — например, если необходимо переопределить системные прокси по умолчанию.
Работа с веб-сервисами
При слиянии коммуникации веб-сервисов клиентской стороны в программу OS X можно использовать в своих интересах много технологий:
NSJSONSerialization
класс преобразовывает между собственными объектами Какао и Объектной нотацией JavaScript (JSON).NSXMLParser
класс обеспечивает Какао API для стиля SAX (потоковая передача) парсинг содержания XML.libxml2 библиотека обеспечивает межплатформенный API C для стиля SAX (потоковая передача) и СТИЛЬ DOM (основанный на дереве) парсинг содержания XML. Для libxml2 документации посмотрите http://xmlsoft .org/.
NSXMLDocument
API (только в OS X) предоставляет поддержку СТИЛЯ DOM для содержания XML.
Кроме того, много сторонних библиотек существуют для работы с веб-сервисами.