Автор оригинала: Ky Nguyen.
В настоящее время 99% приложений нужно подключиться к серверу через API. Так что дело с сетью довольно важно. Как нам с легкостью контролировать API? Я уверен, ваши ответы — AlamoFire
Отказ Ты прав. AlamoFire
Настолько хорош, это должно знать библиотеку в Swift. AlamoFire
, Urlsession
Или любые другие библиотеки — это разъемы для сервера. Но как их использовать эффективно это другая история. Я говорю вам сегодня.
Это статическая структура, которую вы используете каждый день, чтобы взаимодействовать с сервером. Посмотрите на его содержание.
1. Заголовок
static private func getHeaders() -> [String: String]? { return [ "Content-Type": "application/json", "access_token": "your access token or api key" ] }
Большинство запросов нужны заголовки, где вам нужно пройти Access_Token
или api_key.
Чтобы разрешить ваши запросы. готовники
сделаю это. Добавьте свои факторы авторизации здесь, и оно будет прикреплено к вашим запросам, больше не нужно заботиться.
Что случилось, если вы хотите настроить заголовок? Потом.
2. API URL
static private func getUrl(from api: String) -> URL? { let BASE_URL = "" let apiUrl = api.contains("http") ? api : BASE_URL + api return URL(string: apiUrl) }
Вы не хотите повторять https://your_website.com/api/v1
Везде вы называете API, верно? Поставить свой Base_url
внутри geturl
только добавить /Пользователи/: ID
или /транзакции
. Не повторяйте себя.
Нет "/"
В конце Base_url
и всегда начинайте API с "/"
Если вы хотите подключить другую Base_URL, вы можете пройти полный URL-адрес API, например https://custom_website.com/api/v2/users
Отказ Помните, что URL API должен начать с http
. или HTTPS.
.
3. Запрос
Самая важная часть здесь.
static func request(_ api: String, method: HTTPMethod, params: [String: Any]? = nil, headers: [String: String]? = nil, successJsonAction: ((_ result: AnyObject) -> Void)? = nil, successDataAction: ((Data) -> Void)? = nil, failAction: ((_ error: knError) -> Void)? = nil) { let finalHeaders = headers ?? getHeaders() let apiUrl = getUrl(from: api) connector.newRequest(withApi: apiUrl, method: method, params: params, headers: finalHeaders, successJsonAction: successJsonAction, successDataAction: successDataAction, failAction: failAction) }
Давайте посмотрим на слова.
API
: Передайте свой API здесь, только API или полный URL API. Я говорил вам в части 2.Метод
:Httpmethod
: .get, .post, .put, .delete …Пармы
: По умолчанию — это ноль. Вы можете игнорировать это, если не нужно никаких параметрах. В демо, я игнорирую это.Заголовки
: Вы можете добавить пользовательские заголовки здесь. Если это Nil, заголовки по умолчанию будут прикреплены.Suckjsonaction
,УспеховАкэкция
: Я поддерживаю 2 способа обрабатывать ответ: вручную анализировать объект JSON и JSondecoder. Мне нравится анализировать JSON вручную, я могу обрабатывать сложные объекты, множественный вложенный уровни объекта, добавить пользовательские свойства, которые я хочу. Но не могу отрицать, чтоJsondecoder
действительно мощный. Простые объекты или результаты, которые вы хотите, чтобы все свойства,Jsondecoder
будет лучшим выбором.Официальность
Очевидно, что вам нужно справиться с вашим запросом, когда он не удается.
4. Разъем
static private var connector = AlamofireConnector()
Да, ты прав. Я положил разъем как промежуточное программное обеспечение в библиотеку. Я полагаю, однажды, Мэтт удаляет AlamoFire
С И мы просто добавляем другой разъем здесь. Это не повлияет на другой код.
Теперь мы используем AlamoFire или любые библиотеки для подключения к нашему серверу. В любом разъеме есть 2 функции.
1. Запустить
func run(withApi api: URL?, method: HTTPMethod, params: [String: Any]? = nil, headers: [String: String]? = nil, successJsonAction: ((_ result: AnyObject) -> Void)? = nil, successDataAction: ((Data) -> Void)? = nil, failAction: ((_ error: knError) -> Void)?) { guard let api = api else { failAction?(InvalidAPIError(api: "nil")) return } let encoding: ParameterEncoding = method == .get ? URLEncoding.queryString : JSONEncoding.default Alamofire.request(api, method: method, parameters: params, encoding: encoding, headers: headers) .responseJSON { (returnData) in self.answer(response: returnData, successJsonAction: successJsonAction, successDataAction: successDataAction, failAction: failAction) } }
Вам нужно обновить кодировку здесь, если ваш сервер принимается разным кодированием. В моих 6 лет работаю в IOS, только один раз, когда я должен был это изменить.
2. Отвечать
private func answer(response: DataResponse, successJsonAction: ((_ result: AnyObject) -> Void)? = nil, successDataAction: ((Data) -> Void)? = nil, failAction fail: ((_ error: knError) -> Void)?) { if let statusCode = response.response?.statusCode { if statusCode == 500 { return } // handle status code here: 401 -> show logout; 500 -> show error } if let error = response.result.error { let err = knError(code: "unknown", message: error.localizedDescription) fail?(err) return } guard let json = response.result.value as AnyObject?, let data = response.data else { // handle unknown error return } // handle special error convention from server // ... if let successDataAction = successDataAction { successDataAction(data) return } successJsonAction?(json) }
Вам нужно справиться с ответами здесь. Это отличается от проектов. Если вы хотите отладить ответы, вам нужно поставить точки перерыва здесь.
Объект Ошибка
В ответ отсутствует информация. Поэтому я обычно создаю новый тип ошибки.
class knError { var code: String = "unknown" var message: String? var rawData: AnyObject? var displayMessage: String { return message ?? code } init() {} init(code: String, message: String? = nil, rawData: AnyObject? = nil) { self.code = code self.message = message self.rawData = rawData } } class InvalidAPIError: knError { private override init() { super.init() } private override convenience init(code: String, message: String? = nil, rawData: AnyObject? = nil) { self.init() } convenience init(api: String) { self.init() code = "404" message = "Invalid API Endpoint" rawData = api as AnyObject } }
Вы можете добавить У неавторизацииError
или FormiddenError
ответить на ваши контроллеры. Проще понять, чем Ошибка
. , Правильно?
Вот как мне управлять сетью в моих 10 проектах. Почувствуйте себя хорошо с этим и надеемся, что это полезно для вас, ребята. Пожалуйста, доступа к демонстрации на мой https://github.com/nguyentruongky/callingapiswift Отказ
Пожалуйста, не стесняйтесь делиться своими способами или комментариями здесь. С нетерпением жду вашего мнения.
Наслаждайтесь кодированием.
Оригинал: «https://www.codementor.io/@nguyentruongky/calling-api-in-swift-w9tu5lamu»