Создание HTTP и запросов HTTPS

OS X и iOS обеспечивают много APIs общего назначения для того, чтобы сделать HTTP и Запросы HTTPS. С этим APIs можно загрузить файлы на диск, сделать простой HTTP и Запросы HTTPS, или точно настроить запрос на определенные требования серверной инфраструктуры.

При выборе API необходимо сначала рассмотреть, почему Вы делаете Запрос HTTP:

Разделы ниже описывают этот 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 класс для загрузки, Ваш код должен сделать следующее:

  1. Создайте сеанс с пользовательским делегатом и объектом конфигурации по Вашему выбору:

    • Если Вы хотите, чтобы загрузки продолжались, в то время как Ваше приложение не работает, необходимо обеспечить фоновый объект конфигурации сеанса (с уникальным идентификатором) при создании сеанса.

    • Если Вы не заботитесь о фоновой загрузке, можно создать сеанс с помощью любых из предоставленных типов объектов конфигурации сеанса.

  2. Создайте и возобновите одну или более задач загрузки в сеансе.

  3. Ожидайте, пока Ваш делегат не получит вызовы от задачи или сеанса. В частности необходимо реализовать 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 класс:

Возможные ответы на запрос аутентификации

Независимо от которого класса Вы используете, Ваш метод обработчиков аутентификации должен исследовать запрос аутентификации и сказать Загрузочную систему URL, как продолжить:

  • Обеспечить учетные данные для аутентификации, передачи NSURLSessionAuthChallengeUseCredential как расположение (для NSURLSession) или вызовите useCredential:forAuthenticationChallenge: (для NSURLConnection).

    Для получения информации о создании учетного объекта считайте Создание Учетного Объекта.

  • Продолжать запрос, не обеспечивая аутентификацию, передачу NSURLSessionAuthChallengeUseCredential как расположение с a nil учетные данные (для NSURLSession) или вызовите continueWithoutCredentialForAuthenticationChallenge: (для NSURLConnection).

  • Отменять запрос аутентификации, передачу NSURLSessionAuthChallengeCancelAuthenticationChallenge как расположение (для NSURLSession) или вызовите cancelAuthenticationChallenge: (для NSURLConnection). При отмене запроса аутентификации потоковый ошибочный метод делегата вызывают.

  • Чтобы сказать операционной системе обрабатывать проблему как, его обычно был бы, передача NSURLSessionAuthChallengePerformDefaultHandling как расположение (для NSURLSession) или вызовите performDefaultHandlingForAuthenticationChallenge: (для NSURLConnection). Если Вы запрашиваете обработку по умолчанию, то операционная система отправляет любые надлежащие учетные данные, существующие в кэше учетных данных.

  • Отклонить определенный тип аутентификации во время процесса согласования, с намерением принять различный метод, передачу NSURLSessionAuthChallengeRejectProtectionSpace как расположение (для NSURLSession) или вызовите rejectProtectionSpaceAndContinueWithChallenge: (для NSURLConnection).

Создание учетного объекта

В Вашем делегате connection:willSendRequestForAuthenticationChallenge: или connection:didReceiveAuthenticationChallenge: метод, Вы, возможно, должны обеспечить NSURLCredential объект, обеспечивающий фактическую информацию аутентификации.

Дополнительная информация

Узнать больше 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 можно использовать в своих интересах много технологий:

Кроме того, много сторонних библиотек существуют для работы с веб-сервисами.