如何从 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 获取响应头
如何从挂起的 pgPool.connect() 中获取响应/信息?