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

ben*_*_uk 3 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这很有效,因为例如,我可以调用一个函数getCouponForId(_ id: Int),该函数将执行此函数并通过完成处理程序返回响应。

唯一的缺点是,假设用户尝试访问不存在的优惠券,他们将收到错误(来自服务器的 404)。我可以打开结果以确定 asuccessfailurecase,但 Alamofire 尝试将错误响应的主体解码到Coupon我创建的模型中。

展望未来,我创建了一个错误模型,我打算使用它来解码错误。但是话虽如此,我在将它实现到这个函数中时遇到了麻烦。

有没有人对我如何处理这个有任何想法?

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

Fua*_*mal 5

您提到的文章中的类似登录功能,针对 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)
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用相同的指南,但我正面临这个错误(通用类型“结果”专门使用太少的类型参数(得到 1,但预期为 2)) (2认同)
  • @Mero_vic280 第二个参数应该是 AFError : AF.request(Router.login(email: email,password:password)) .validate(statusCode: 200..&lt;300) .responseDecodable { (response: DataResponse&lt;UserCredentials, AFError&gt;) in您的代码} (2认同)