如何从 MoyaError 获取错误响应

Posted

技术标签:

【中文标题】如何从 MoyaError 获取错误响应【英文标题】:how to get the error response from 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 响应。

【问题讨论】:

【参考方案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()
    使用do 运算符 检查 onNext 发射是否确实是有效发射 如果无效则抛出错误,表示可观察操作已失败。

响应验证

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

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 响应。

以上是关于如何从 MoyaError 获取错误响应的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的 hasura graphql 查询中获取错误响应

如何从 Apollo 客户端的 useQuery 获取响应头

JS Axios - 如何在发生错误时获取响应正文?

如何从挂起的 pgPool.connect() 中获取响应/信息?

如何从 angularjs 中的 JSONP 错误回调中获取数据?

如何从这种错误的 JSON 格式中获取所需的数据?