Большинству приложений требуется сеть для подключения к внешним службам и источникам данных. «Сеть» означает обмен информацией через «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, должны быть организованы в коллекции и сущности, в этом случае коллекция представляет собой группу книг, представленную в виде:
Этот URL вернет коллекцию книг. Вы также можете реализовать нумерацию страниц и поиск в этой коллекции ( https://example.com/api/v2/books?page=2
https://example.com/api/v2/books?query='Jump Start PHP Environment'
Сущность — это конкретная книга из коллекции. Он может быть представлен как https://example.com/api/v2/books/1
1
Используя глаголы GET
POST
PUT
Используя глагол 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, а параметры — action
format
meta
type
GET
Создание task
После определения метод resume
При определении task
print(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 в качестве альтернативы.
Поскольку работа в сети — обычная задача для каждого разработчика, я хотел бы услышать о вашем подходе и о том, какие методики или библиотеки лучше всего подходят для вас.