Рубрики
Uncategorized

Вызов API в Swift

В настоящее время 99% приложений нужно подключиться к серверу через API. Так что дело с сетью довольно важно. Как нам с легкостью контролировать API? Я уверен, ваши ответы alamofire. Ты прав….

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