在 API 调用期间从服务器获取错误消息

Posted

技术标签:

【中文标题】在 API 调用期间从服务器获取错误消息【英文标题】:getting error message from server during API call 【发布时间】:2019-04-26 09:50:11 【问题描述】:

我有一个应用程序,我通过扩展 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)

【问题讨论】:

您的网络请求在哪里?请也添加该部分。 完成请求 看起来您使用的是导入库而不是本机网络堆栈。你在用 Alamofire 吗? 是的,我正在使用 Alamofire 好的,这是 Alamofire 问题,所以我为您更新了标签。 【参考方案1】:

official Alamofire docs中提到validate()没有任何参数

自动验证 200..

因此,如果您不包含 Alamofire 的 validate(),您的意思是无论状态码如何,如果请求确实通过了,您将认为它成功,这就是它在失败块中没有显示任何内容的原因。

但是,如果您更喜欢使用它,是的,它会给您一个 ResponseValidationFailureReason 错误,但您仍然可以访问 response.data。尝试打印它,您应该会看到来自服务器的预期错误响应:

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

【讨论】:

以上是关于在 API 调用期间从服务器获取错误消息的主要内容,如果未能解决你的问题,请参考以下文章

构建期间调用的 setState() 或 markNeedsBuild() - 设置从 API 获取的变量的值时?

在 IIS 服务器上的 PUT API 调用期间未触发 Application_BeginRequest

Flutter 错误 - 在构建期间调用了 setState() 或 markNeedsBuild()

从 google play 服务 api 调用个人资料图片 url 时发生错误

如何正确配置服务器和浏览器以避免cors错误?获取 API + Node.js

从 React 前端的 Zoho API 获取数据时出现 CORS 错误