我正在使用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)。我可以打开结果以确定success
或failure
的情况,但是Alamofire尝试将错误响应的主体解码为我创建的Coupon
模型。
展望未来,我创建了一个错误模型,打算使用该错误模型进行解码。但话虽如此,我在将其实现到此功能时遇到了麻烦。
有人对我该如何处理有任何想法吗?
(我通过遵循本指南创建了此功能-希望它可以为我的工作提供更多背景信息。https://github.com/AladinWay/NetworkingExample)
答案 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