gpt4 book ai didi

RxAlamofire - 如何获得错误响应?

转载 作者:行者123 更新时间:2023-12-04 21:04:31 26 4
gpt4 key购买 nike

当 RxAlamofire 调用发生错误时,我需要响应正文。我见过this hack但我想知道是否有更清洁的方法。

受此启发,我创建了这个 RxAlamofire fork有一个类似的黑客。有了它,错误通常是 DataResponseError 的一个实例。所以你可以这样做:

RxAlamofire.data(method, url).subscribe(

onError: { error in

if let error = error as? DataResponseError<Data> {

// Get response body (in this case, convert it to a String)
if let data = error.response.data {
let message = String(data: data, encoding: String.Encoding.utf8)
print("Message: \(message)")
}

// Get status code
if let statusCode = error.response.response?.statusCode {
print("Status code: \(statusCode)")
}
}
}
)

最佳答案

问题描述。我正在使用 RxAlamofire 发出网络请求,我需要从错误响应的正文中获取信息。

我以以下方式进行了黑客攻击:

添加了一个 PError:

import UIKit
import Alamofire
import ObjectMapper

class PError: Error, Mappable {
var message: String?
var statusCode: Int?

required init?(map: Map) {

}

func mapping( map: Map) {
message <- map["error.message"]
statusCode <- map["error.statusCode"]
}
}

现在向 DataRequest 添加了这样的扩展:
import Alamofire
import ObjectMapper

extension DataRequest {
//Overriding several methods from Alamofire Validation
@discardableResult
public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {
return validate { [unowned self] _, response, bodyData in
return self.validate(statusCode: acceptableStatusCodes, response: response, bodyData: bodyData)
}
}

//Overriding several methods from Alamofire Validataion
fileprivate func validate<S: Sequence>(
statusCode acceptableStatusCodes: S,
response: HTTPURLResponse, bodyData: Data?)
-> ValidationResult
where S.Iterator.Element == Int
{
if acceptableStatusCodes.contains(response.statusCode) {
return .success
} else {
var error: Error = AFError.responseValidationFailed(reason: AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: response.statusCode))
if let bodyData = bodyData {
if let jsonString = String(data: bodyData, encoding: .utf8) {
if let errorNew = Mapper<PError>().map(JSONString: jsonString)
{
error = errorNew
}
}
}
return .failure(error)
}
}
}

接下来,在代码中的某处,您将能够使用此自定义错误对象:
if let err = error as? PError {
status = err.message ?? "No message in the error description"
}
else

关于RxAlamofire - 如何获得错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49939309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com