【问题标题】:how to get the error response from MoyaError如何从 MoyaError 获取错误响应
【发布时间】:2017-06-30 16:24:56
【问题描述】:

类似于this,但这次我需要检索服务器的JSOn响应。

这是我现有的代码:

return Observable.create{ observer in
            let _ = self.provider
                .request(.getMerchantDetails(qrId: qrId))
                .filterSuccessfulStatusCodes()
                .mapJSON()
                .subscribe(onNext: { response in
                    observer.onNext(RQRMerchant(json: JSON(response)))
                }, onError: { error in
                    observer.onError(error)
                })
            return Disposables.create()

我的问题是:我可以通过error.localizedDescription 获取错误响应代码 404 但我还想获取 404 HTTP 请求的 JSON 响应。

【问题讨论】:

    标签: swift3 rx-swift moya


    【解决方案1】:

    我也遇到过同样的问题,对我来说最简单和最干净的解决方案是扩展MoyaError 以包含解码错误对象的属性。就我而言,我使用的是Decodable 对象,因此您可以为可解码的BackendError 编写类似的内容,表示您可能从服务器获得的错误:

    extension MoyaError {
        public var backendError: BackendError? {
            return response.flatMap {
                try? $0.map(BackendError.self)
            }
        }
    }
    

    如果您更喜欢直接处理 JSON,您可以调用 mapJSON 方法而不是映射到 Decodable

    那么您只需执行以下操作即可获取未成功状态码的错误信息:

    onError: { error in
        let backendError = (error as? MoyaError).backendError
    }
    

    【讨论】:

      【解决方案2】:

      由于您的服务器的响应也包含在 JSON 中,这意味着您的 onNext 发射可以是成功的 JSON 响应或无效的 JSON 响应。

      使用do操作符检查响应的有效性

      您可以通过执行以下操作来检查响应的有效性:

      return Observable.create{ observer in
      
              let _ = self.provider
                  .request(.getMerchantDetails(qrId: qrId))
                  .filterSuccessfulStatusCodes()
                  .mapJSON()
                  .do(onNext: { response in 
                       let isValidResponse : Bool = false // check if response is valid
      
                        if !isValidResponse {
                            throw CustomError.reason
                        }
                  })
                  .subscribe(onNext: { response in
                      observer.onNext(RQRMerchant(json: JSON(response)))
      
                  }, onError: { error in
                      observer.onError(error)
      
                  })
      
              return Disposables.create()
      
      1. 使用do 运算符
      2. 检查 onNext 发射是否确实是有效发射
      3. 如果无效则抛出错误,表示可观察操作已失败。

      响应验证

      为了将您的响应验证代码保存在正确的位置,您可以在响应类定义中定义一个类函数来验证它是否有效:

      class ResponseOfTypeA {
          public class func isValid(response: ResponseOfTypeA) throws {
              if errorConditionIsTrue {
                  throw CustomError.reason
              }
          }
      }
      

      以便您可以执行以下操作:

          // Your observable sequence
          .mapJSON()
          .do(onNext: ResponseOfTypeA.isValid)
          .subscribe(onNext: { response in 
              // the rest of your code
      
          })
      

      【讨论】:

      • 您好,感谢您抽出宝贵时间。我明白你想对我说什么,但我想做的是获得服务器的 JSON 响应,并带有 404 HTTP 响应。
      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 2013-04-28
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多