我正在使用 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)。我可以打开结果以确定 asuccess或failurecase,但 Alamofire 尝试将错误响应的主体解码到Coupon我创建的模型中。
展望未来,我创建了一个错误模型,我打算使用它来解码错误。但是话虽如此,我在将它实现到这个函数中时遇到了麻烦。
有没有人对我如何处理这个有任何想法?
(我通过遵循本指南创建了此功能 - 希望它可以为我正在做的事情提供更多背景信息。https://github.com/AladinWay/NetworkingExample)
您提到的文章中的类似登录功能,针对 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)
| 归档时间: |
|
| 查看次数: |
8238 次 |
| 最近记录: |