В мире приложений практически все приложения используют веб-сервисы для получения данных из Интернета. Это позволяет пользователю отправлять и получать данные из Интернета. Swift использует URLSession для получения данных из Интернета и использует JSONDecoder для их декодирования. Swift использует Codable, чтобы сделать данные json совместимыми с типами Swift.

В этой статье вы узнаете:

  • Что такое URL и как его сделать?
  • Создание сетевого запроса
  • Как работать с API
  • Как декодировать данные с помощью JSONDecoder
  • Как использовать протокол Codable

Как создать URL

URL означает универсальный указатель ресурса.

Он состоит из двух компонентов: протокола и домена. Swift позволяет вам определять и изменять запросы, используя тип URL. Тип URL принимает строковый параметр и возвращает необязательный URL.

let url = URL(string: "https://www.gurjit.co")!

Создать сетевой запрос

Swift создает и запускает сетевые запросы через Интернет, используя класс URLSession. Получая доступ к свойству общего типа, URLSession обеспечивает доступ к общему экземпляру.

Метод dataTask объекта URLSession принимает параметры URL и обработчик завершения. Когда dataTask завершается, вызывается замыкание, называемое обработчиком завершения. Данные, ответ и ошибка — это три аргумента обработчика завершения. Если задача с данными выполнена успешно, данные и ответ имеют значение, а в случае неудачи — значение имеет ошибка.

let dataTask = URLSession.shared.dataTask(with: url) {
  (data, response, error) in 

    if let data = data {
      print(data)
    }
}

Для выполнения запроса необходимо вызвать методresume() экземпляра задачи с данными.

dataTask.resume()

Результат:

21135 bytes

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

Работа с API

API — расшифровывается как интерфейс протокола приложения.

В этом примере мы используем Flickr API для получения данных из Интернета. Вы можете сгенерировать свой собственный ключ API из этой страницы и заменить его api_key в URL-адресе.

let url = URL(string:"https://api.flickr.com/services/rest/?method=flickr.
photos.search&api_key=526ada5ee1ea2cf61ac6bd3d3d2f405e&tags=kitten&page=0&
format=json&nojsoncallback=1")!

let task = URLSession.shared.dataTask(with: url) {
  (data, response, error) in

  if let data = data,
      let string = String(data:data, encoding: .utf8) {
        print(string)
  }
}

task.resume()

Запустите ваше приложение сейчас, и оно напечатает следующий ответ

{
 "photos": {
  "page": 1,
  "pages": 8736,
  "perpage": 100,
  "total": 873595,
  "photo": [{
   "id": "52754631336",
   "owner": "58526667@N00",
   "secret": "2ebf0e5d4e",
   "server": "65535",
   "farm": 66,
   "title": "sky 17.03.2023 - gimme 5 !",
   "ispublic": 1,
   "isfriend": 0,
   "isfamily": 0
  }, {
   "id": "52751532069",
   "owner": "191790606@N07",
   "secret": "9488e52ec7",
   "server": "65535",
   "farm": 66,
   "title": "in the zone",
   "ispublic": 1,
   "isfriend": 0,
   "isfamily": 0
  }, {
   "id": "52750669402",
   "owner": "41597157@N00",
   "secret": "611caee3de",
   "server": "65535",
   "farm": 66,
   "title": "Cassidy as the kitten she was 20 months ago",
   "ispublic": 1,
   "isfriend": 0,
   "isfamily": 0
  }, {
   "id": "52744271259",
   "owner": "142048314@N07",
   "secret": "89fe00a23b",
   "server": "65535",
   "farm": 66,
   "title": "Echo&Ember",
   "ispublic": 1,
   "isfriend": 0,
   "isfamily": 0
  }]
 },
 "stat": "ok"
}

Поздравляем! Вы только что получили свой первый API и теперь можете обрабатывать данные оттуда, ура! Длина обрабатываемых json-данных не имеет значения; важна структура данных. Обработанные данные json могут быть довольно длинными.

Мы разрежем код json, упомянутый выше.

  • Значение photos содержит значения page, pages, perpage, total и photo.
  • Значение photo содержит массив данных
  • Каждое значение фотографии содержит идентификатор, владельца, секрет, сервер, ферму, название, является общедоступным, является другом, является семьей. Каждое значение является либо строкой, либо целым числом.
  • И конечное значение status ok указывает на то, что ответ сервера был успешным.

Как использовать кодируемый интерфейс

Swift имеет встроенный протокол под названием Codable, который упрощает работу с API. Протокол Codable преобразует типы данных Json в тип swift.

Работа с протоколом Codable может показаться вам сложной задачей. Эта модель создается в соответствии с ответом Flickr json. Он будет меняться по мере того, как вы будете работать с разными API. Добавьте следующий код в новый файл Swift с именем FlickrImageInfo.swift.

struct FlickrImageInfo: Codable {
    let photos: FlickrPageResult
}

struct FlickrPageResult: Codable {
    let photo: [FlickrUrls]
    let page: Int
    let pages: Int
    let perpage: Int
    let total: Int
}

struct FlickrUrls: Codable {
    let id: String
    let owner: String
    let secret: String
    let server: String
    let farm: Int
}

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

Как декодировать с помощью JSONDecoder

Чтобы преобразовать ответ JSON в тип Swift, мы будем использовать JSONDecoder. Метод decode JSONDecoder принимает два параметра: тип и данные. Это может привести к ошибкам, поэтому используйте try? . Это означает, что функция вернет либо значение, либо ноль.

let url = URL(string:"https://api.flickr.com/services/rest/?method=flickr.
photos.search&api_key=526ada5ee1ea2cf61ac6bd3d3d2f405e&tags=kitten&page=0&
format=json&nojsoncallback=1")!

let task = URLSession.shared.dataTask(with: url) {
  (data, response, error) in

  let jsonDecoder = JSONDecoder()
  if let data = data,
      let result = try? jsonDecoder.decode(FlickrImageInfo.self, from: data) {
        print(result)
  }
}

task.resume()

Заключение

Вы можете увидеть различные и более сложные данные JSON при взаимодействии с другими API. Не беспокойтесь о длине ответа, просто поймите структуру данных и создайте собственную модель в соответствии с ней.

Чтобы найти новейшие советы и рекомендации по разработке iOS, Xcode и Swift, посетите https://www.gurjit.co.

Спасибо!