使用Alamofire 5和responseDecodable函数解码错误响应

时间:2019-01-12 20:21:12

标签: alamofire

我正在使用Alamofire 5(测试版1)编写WooCommerce的API客户端,这将使我能够获取订单,优惠券等并进行创建。注意我正在使用新的.responseDecodable函数。

我已经使用下面的performRequest函数来设置我的API客户端,如下所示:

@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)。我可以打开结果以确定successfailure的情况,但是Alamofire尝试将错误响应的主体解码为我创建的Coupon模型。

展望未来,我创建了一个错误模型,打算使用该错误模型进行解码。但话虽如此,我在将其实现到此功能时遇到了麻烦。

有人对我该如何处理有任何想法吗?

(我通过遵循本指南创建了此功能-希望它可以为我的工作提供更多背景信息。https://github.com/AladinWay/NetworkingExample

2 个答案:

答案 0 :(得分:2)

您提到的文章中的类似登录功能,已针对Alamofire 5的当前beta更新,并处理了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)
    }
  }

答案 1 :(得分:1)

只需更新

request.responseDecodable(decoder: decoder, completionHandler: { (response: AFDataResponse<T>) in

request.responseDecodable(decoder: decoder, completionHandler: { (response: DataResponse<T>) in
相关问题