Автор оригинала: 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»