Декодирование ответа об ошибке с использованием Alamofire 5 и функции responseDecodable - PullRequest
0 голосов
/ 12 января 2019

Я пишу API-клиент для WooCommerce с использованием Alamofire 5 (бета-версия 1), который позволит мне получать заказы, купоны и т. Д., А также создавать их. Примечание. Я использую новую функцию .responseDecodable.

Я настроил свой API-клиент, используя следующую функцию performRequest, которая выглядит следующим образом:

@discardableResult
private static func performRequest<T:Decodable>(route: APIConfiguration,
                                                decoder: JSONDecoder = JSONDecoder(),
                                                completion: @escaping (Result<T>)->Void) -> DataRequest {
    return AF.request(route)
        .responseDecodable(decoder: decoder) { (response: DataResponse<T>) in
            completion(response.result)
    }
}

Это хорошо работает, так как я могу, например, вызвать функцию getCouponForId(_ id: Int), которая выполнит эту функцию и вернет ответ через обработчик завершения.

Единственным недостатком является то, что, скажем, пользователь пытается получить доступ к купону, который не существует, он получит ошибку (404 с сервера). Я могу включить результат, чтобы определить случай success или failure, но Alamofire пытается декодировать тело ответа об ошибке в созданную мной модель Coupon.

В дальнейшем я создал модель ошибки, которую я намерен декодировать с помощью ошибки. Но после всего сказанного у меня возникли проблемы с его внедрением в эту функцию.

У кого-нибудь есть идеи, как мне справиться с этим?

(Я создал эту функцию, следуя этому руководству - надеюсь, оно могло бы предоставить немного больше контекста тому, что я делаю. https://github.com/AladinWay/NetworkingExample)

1 Ответ

0 голосов
/ 17 января 2019

Аналогичная функция входа в систему из упомянутой вами статьи, обновленная для текущей бета-версии Alamofire 5 и имеющая дело с 404, 401 и т. Д. (С помощью оператора guard)

  static func login(email: String, password: String, completion:@escaping (Result<UserCredentials>)->Void) {
    performRequest(router: Router.login(email: email, password: password), completion: completion)
    AF.request(Router.login(email: email, password: password))
      .validate(statusCode: 200..<300)
      .responseDecodable { (response: DataResponse<UserCredentials>) in
        guard response.result.isSuccess else {
          print("? Error on login: \(String(describing: response.error))")
          return
        }
        completion(response.result)
    }
  }
...