1

类似,但这次我需要检索服务器的 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()

我的问题是:我可以得到错误响应代码 404error.localizedDescription但我也想得到 404 HTTP 请求的 JSON 响应。

4

2 回答 2

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
}
于 2017-10-26T08:51:31.817 回答
0

由于您的服务器的响应也包含在 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

    })
于 2017-07-01T10:06:25.113 回答