在API调用期间从服务器获取错误消息 [英] getting error message from server during API call

查看:128
本文介绍了在API调用期间从服务器获取错误消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,通过扩展ObservableType可以将RxSwift用于我的网络,这很好用,但是我现在遇到的问题是当我发出API请求时出现错误,我无法显示发送的特定错误消息从服务器。现在,如何获得从服务器发送的特定错误响应

I have an app where I used RxSwift for my networking by extending ObservableType this works well but the issue I am having now is when I make an API request and there is an error, I am unable to show the particular error message sent from the server. Now how can I get the particular error response sent from the server

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
}

来自服务器的响应可能是

response from the server could be

{
  "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)


推荐答案

官方Alamofire文档,其中提到 validate()没有任何参数


自动验证200 .. <300范围内的状态代码,并且
的响应的Content-Type头与请求的
的Accept头相匹配

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()您是说无论状态码如何,请求均已从头到尾,您将认为它是成功的,所以这就是为什么它在故障块中什么都没有显示的原因。

So if you do not include Alamofire's validate() you are saying that no matter the status code, if the request did get through, you will consider it successful, so that's why it shows nothing in the failure block.

但是,如果您喜欢使用它,可以,它将为您提供 ResponseValidationFailureReason 错误,但是您仍然可以访问 response.data 。尝试打印它,您应该会从服务器看到预期的错误响应:

However if you prefer to use it, yes, it will give you an ResponseValidationFailureReason error, but you still have access to the response.data. Try printing it, you should see the expected error response from the server:

if let responseData = response.data {
    print(String(data: responseData, encoding: .utf8))
}

这篇关于在API调用期间从服务器获取错误消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆