我有一个应用程序,我通过扩展 ObservableType 将 RxSwift 用于我的网络,这很好用,但我现在遇到的问题是当我发出 API 请求时出现错误,我无法显示发送的特定错误消息从服务器。现在我怎样才能得到从服务器发送的特定错误响应
extension ObservableType {
func convert<T: EVObject>(to observableType: T.Type) -> Observable<T> where E: DataRequest {
return self.flatMap({(request) -> Observable<T> in
let disposable = Disposables.create {
request.cancel()
}
return Observable<T>.create({observer -> Disposable in
request.validate().responseObject { (response: DataResponse<T>) in
switch response.result {
case .success(let value):
if !disposable.isDisposed {
observer.onNext(value)
observer.onCompleted()
}
case .failure(let error):
if !disposable.isDisposed {
observer.onError(NetworkingError(httpResponse: response.response,
networkData: response.data, baseError: error))
observer.onCompleted()
}
}
}
return disposable
})
})
}
}
let networkRetryPredicate: RetryPredicate = { error in
if let err = error as? NetworkingError, let response = err.httpResponse {
let code = response.statusCode
if code >= 400 && code < 600 {
return false
}
}
return true
}
// Use this struct to pass the response and data along with
// the error as alamofire does not do this automatically
public struct NetworkingError: Error {
let httpResponse: HTTPURLResponse?
let networkData: Data?
let baseError: Error
}
来自服务器的响应可能是
{
"status" : "error",
"message" : " INSUFFICIENT_FUNDS"
}
或
{
"status" : "success",
"data" : " gghfgdgchf"
}
我的回复是这样处理的
class MaxResponse<T: NSObject>: MaxResponseBase, EVGenericsKVC {
var data: T?
public func setGenericValue(_ value: AnyObject!, forUndefinedKey key: String) {
switch key {
case "data":
data = value as? T
default:
print("---> setGenericValue '\(value)' forUndefinedKey '\(key)' should be handled.")
}
}
public func getGenericType() -> NSObject {
return T()
}
}
错误是
return ApiClient.session.rx.request(urlRequest: MaxApiRouter.topupWall(userId: getUser()!.id!, data: body))
.convert(to: MaxResponse<Wall>.self)
最佳答案
在official Alamofire docs提到validate()
,没有任何参数:
Automatically validates status code within 200..<300 range, and that the Content-Type header of the response matches the Accept header of the request, if one is provided.
所以如果你不包括 Alamofire 的 validate()
你是说无论状态码如何,如果请求确实通过了,你就会认为它成功了,所以这就是为什么它在失败 block 。
但是,如果您更喜欢使用它,是的,它会给您一个 ResponseValidationFailureReason
错误,但您仍然可以访问 response.data
。尝试打印它,您应该看到来自服务器的预期错误响应:
if let responseData = response.data {
print(String(data: responseData, encoding: .utf8))
}
关于swift - 在 API 调用期间从服务器获取错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865017/