Создание HTTP и запросов HTTPS
OS X и iOS обеспечивают много APIs общего назначения для того, чтобы сделать HTTP и Запросы HTTPS. С этим APIs можно загрузить файлы на диск, сделать простой HTTP и Запросы HTTPS, или точно настроить запрос на определенные требования серверной инфраструктуры.
При выборе API необходимо сначала рассмотреть, почему Вы делаете Запрос HTTP:
Если Вы пишете приложение Киоска, необходимо использовать
NKAssetDownloadAPI для загрузки содержания в фоновом режиме.Если необходимо загрузить файл на диск в OS X, самый простой путь состоит в том, чтобы использовать
NSURLDownloadкласс. Для получения дополнительной информации посмотрите Файлы Загрузки к Диску.Необходимо использовать
CFHTTPStreamесли какое-либо следующее является истиной:У Вас есть строгое требование для не использования Objective C.
Необходимо переопределить настройки прокси.
Необходимо быть совместимы с определенным несовместимым сервером.
Для получения дополнительной информации посмотрите, что Запросы Создания Используют Базовую Основу.
Иначе, необходимо обычно использовать
NSURLSessionилиNSURLConnectionAPIs.
Разделы ниже описывают этот 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 классы работают так же на высоком уровне. Однако существует несколько существенных различий:
NSURLSessionAPI предоставляет поддержку для задач загрузки, ведущих себя во многом как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/.
NSXMLDocumentAPI (только в OS X) предоставляет поддержку СТИЛЯ DOM для содержания XML.
Кроме того, много сторонних библиотек существуют для работы с веб-сервисами.