Статьи

Ускоренный курс по работе в сети в iOS

Большинству приложений требуется сеть для подключения к внешним службам и источникам данных. «Сеть» означает обмен информацией через «http» (протокол передачи гипертекста), один из наиболее часто используемых протоколов. Каждый раз, когда вы открываете браузер и извлекаете или отправляете данные, вы используете HTTP в качестве протокола. В этой статье вы узнаете, как работать с сетью в iOS, рассмотрев следующие параметры:

  • HTTP
  • API отдыха
  • NSURLSession : сеть без сторонних библиотек
  • Alamofire : сеть со сторонней библиотекой для упрощения процесса
  • Список других сетевых библиотек

Если вы уже знакомы с HTTP и REST API, перейдите к NSURLSession

Эта статья является частью серии статей, связанных с iOS, которые я пишу, для приложения, находящегося в разработке, которое позже будет открыто. Приложение использует данные из Wikimedia Commons и использует REST API сайта для доступа к этим данным.

HTTP

HTTP является одним из самых популярных протоколов. Если вы читаете эту статью, вы используете HTTP для получения HTML-страницы с серверов Sitepoint. Ваш клиент (браузер) отправляет запрос на сервер, а сервер возвращает информацию о запрошенных ресурсах. В контексте мобильного приложения оно запрашивает списки данных, а сервер отвечает запрошенными данными. Это так называемые запросы GET

Иногда вам необходимо опубликовать некоторые данные на сервере из приложения, например, обновления. Это так называемые POST

Существуют и другие типы запросов (или глаголов), такие как:

  • ПОЛУЧИТЬ
  • ПОЧТА
  • ГОЛОВА
  • ПОЛОЖИЛ
  • PATCH

Если вы хотите больше узнать о протоколе HTTP, я рекомендую эту статью в Википедии .

REST API

REST API — это простой и стандартный способ обмена данными. У вас есть некоторые данные на сервере, и вы хотите получить их в приложении. Во-первых, вам нужно знать, как структурировать ваш API или «Интерфейс прикладного программирования», поскольку большинство API-интерфейсов являются оболочкой для базы данных.

Например, у вас есть таблица базы данных, содержащая список книг, и ваше приложение должно получать сведения об этих книгах.

Во-первых, вам нужно место для получения этих данных. В этом примере доменом является https://books.com/ , а API — в / api .

Как вы должны представлять свои данные в API?

Данные, доступные через API, должны быть организованы в коллекции и сущности, в этом случае коллекция представляет собой группу книг, представленную в виде:

https://example.com/api/books

Этот URL вернет коллекцию книг. Вы также можете реализовать нумерацию страниц и поиск в этой коллекции ( https://example.com/api/v2/books?page=2https://example.com/api/v2/books?query='Jump Start PHP Environment' Сущность — это конкретная книга из коллекции. Он может быть представлен как https://example.com/api/v2/books/11

Используя глаголы GETPOSTPUT Используя глагол GET Например, https://example.com/api/v2/books/7 Используя глагол POST Вы также должны указать обязательные поля с другими параметрами.

Теперь у вас есть представление о том, как организовать ресурсы в API, пришло время решить, как вы будете представлять данные. Мой любимый формат — JSON, поскольку он помогает двум системам общаться таким образом, чтобы он не был связан с самим языком.

Сообщение JSON может выглядеть так:

 {
  "id": 7,
  "userId": 20,
  "title": "Jump Start PHP Environment",
  "description": "Many entry level PHP developers want a quick path to glory, a shortcut to “knowing PHP.” Too many books and tutorials go straight into a pre-made, awful environment that just wants you to code, with no regard for security, version control, or other absolutely essential practices. This book is aimed at the absolute beginner who wants to start learning PHP, but aims to set you up with a thorough understanding of what makes for a good, modern, adaptable PHP environment before you start diving into PHP itself."
}

Если вы заинтересованы в создании собственного API, я рекомендую эту статью Sitepoint или если вы используете WordPress и хотите превратить его в API, эта статья .

NSURLSession

С iOS 7+ вы можете работать с NSURLSession

NSURLSession Alamofire построен на этой технологии. Следующий код является примером (не готовым к производству) того, как извлечь токен для входа из API Wikimedia Commons.

 class WCLoginApi {

  static func nsurlAction(){

      // Create a session configuration
      let session = NSURLSession.sharedSession()

      var stringUrl: String = "https://en.wikipedia.org/w/api.php"
      stringUrl = stringUrl.stringByAppendingString("?action=query")
      stringUrl = stringUrl.stringByAppendingString("&format=json")
      stringUrl = stringUrl.stringByAppendingString("&meta=tokens")
      stringUrl = stringUrl.stringByAppendingString("&type=login")

      let url: NSURL = NSURL(string: stringUrl)!

      let request = NSMutableURLRequest(URL: url)
      request.HTTPMethod = "GET"
      request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

      let task = session.dataTaskWithRequest(request) {
          (
          let data, let response, let error) in

          guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
              print("error")
              return
          }

          let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
          print(dataString)
      }

      task.resume()

  }
}

WCLoginApi.nsurlAction()

Сначала вам нужна конфигурация сеанса, и в этом примере вы получаете конфигурацию общего сеанса. Это полезный метод, если ваше приложение будет неоднократно использовать одну и ту же общую конфигурацию соединения, но не если вы ожидаете делать разные запросы.

После получения конфигурации вам необходимо создать URL и параметры. В этом случае базовый URL-адрес — https://en.wikipedia.org/w/api.php, а параметры — actionformatmetatype GET

Создание task После определения метод resume При определении taskprint(dataString)

Alamofire

Alamofire — это авторитетная библиотека, целью которой является упрощение работы с iOS. Если вы планируете использовать больше пользовательских сетей, например, с использованием другого протокола, эта библиотека может вам не подойти. Но если вы планируете использовать традиционные REST API и простые сети, то я рекомендую попробовать Alamofire.

Вы можете установить Alamofire с CocoaPods, Carthage или вручную, поэтому я рекомендую прочитать руководство по их установке для вашего предпочтительного метода.

Вот более ранний пример, переписанный для использования Alamofire:

 import Alamofire

class WCLoginApi {
    static func alamofireExample() -> Void
    {
        Alamofire.request(
            .GET,
            "https://en.wikipedia.org/w/api.php",
            parameters: [
                "action": "query",
                "format": "json",
                "meta": "tokens",
                "type": "login"
            ]).responseJSON { response in

                if let JSON = response.result.value {

                    if let loginTokenKey = JSON.objectForKey("query")?.objectForKey("tokens")?.objectForKey("logintoken") {
                        print(loginTokenKey)
                    }else{
                        print("Error to parse JSON")
                    }

                }else{
                    print("Error with response")
                }
        }
    }
}

WCLoginApi.alamofireExample()

Чтобы сделать запрос, вы вызываете метод request.GET Третий аргумент — это базовый URL без каких-либо аргументов в виде String

Далее приведен список параметров (такой же, как в NSURLSession В этом примере вы не кодируете их, как в NSURLSession Вы можете создать URL-адрес и строку параметров самостоятельно, но это лучший подход.

При работе с Rest APIS вы столкнетесь с разными форматами. API Wikimedia Commons поддерживает разные форматы, но, как вы знаете, он будет в JSON, вы можете использовать метод responseJSON Существуют другие методы обратного вызова для разных форматов.

Я думаю, что это проще и более структурировано, чем родной способ iOS. Существуют лучшие способы разработки с использованием нативного метода, но Alamofire упрощает его. Alamofire не ограничивается извлечением данных, но также может публиковать и загружать данные.

Alamofire позволяет изменять настройки кэша, проверять заголовки, цепочечные ответы (например, проверять метод responseJSON

Что еще?

Работа в сети — обычная задача, поэтому ваши варианты упрощения процесса не ограничиваются Alamofire. Вот некоторые другие библиотеки для рассмотрения:

  • SwiftHTTP : простая оболочка Swift вокруг NSURLSession
  • Моя : быстрая альтернатива Alamofire.
  • FSNetworking : реализация сети Foursquare Objective-C.
  • Reach : простая библиотека Swift для проверки наличия сети.
  • iOS-netdiag : библиотека диагностики сети Objective-C.

В этой статье вы познакомились с основами работы с сетью iOS и REST Apis, стандартным способом iOS для работы с сетью, и Alamofire в качестве альтернативы.

Поскольку работа в сети — обычная задача для каждого разработчика, я хотел бы услышать о вашем подходе и о том, какие методики или библиотеки лучше всего подходят для вас.