Swift API调用期间从服务器获取错误消息
我有一个应用程序,我通过扩展ObservateType将RxSwift用于我的网络。这很好,但我现在遇到的问题是,当我发出API请求时,出现错误,我无法显示从服务器发送的特定错误消息。现在,我如何获得从服务器发送的特定错误响应Swift API调用期间从服务器获取错误消息,swift,generics,alamofire,rx-swift,Swift,Generics,Alamofire,Rx Swift,我有一个应用程序,我通过扩展ObservateType将RxSwift用于我的网络。这很好,但我现在遇到的问题是,当我发出API请求时,出现错误,我无法显示从服务器发送的特定错误消息。现在,我如何获得从服务器发送的特定错误响应 extension ObservableType { func convert<T: EVObject>(to observableType: T.Type) -> Observable<T> where E: DataReques
extension ObservableType {
func convert<T: EVObject>(to observableType: T.Type) -> Observable<T> where E: DataRequest {
return self.flatMap({(request) -> Observable<T> in
let disposable = Disposables.create {
request.cancel()
}
return Observable<T>.create({observer -> Disposable in
request.validate().responseObject { (response: DataResponse<T>) in
switch response.result {
case .success(let value):
if !disposable.isDisposed {
observer.onNext(value)
observer.onCompleted()
}
case .failure(let error):
if !disposable.isDisposed {
observer.onError(NetworkingError(httpResponse: response.response,
networkData: response.data, baseError: error))
observer.onCompleted()
}
}
}
return disposable
})
})
}
}
let networkRetryPredicate: RetryPredicate = { error in
if let err = error as? NetworkingError, let response = err.httpResponse {
let code = response.statusCode
if code >= 400 && code < 600 {
return false
}
}
return true
}
// Use this struct to pass the response and data along with
// the error as alamofire does not do this automatically
public struct NetworkingError: Error {
let httpResponse: HTTPURLResponse?
let networkData: Data?
let baseError: Error
}
或
我的回答是这样处理的
class MaxResponse<T: NSObject>: MaxResponseBase, EVGenericsKVC {
var data: T?
public func setGenericValue(_ value: AnyObject!, forUndefinedKey key: String) {
switch key {
case "data":
data = value as? T
default:
print("---> setGenericValue '\(value)' forUndefinedKey '\(key)' should be handled.")
}
}
public func getGenericType() -> NSObject {
return T()
}
}
class MaxResponse:MaxResponseBase,EVGenericsKVC{
var数据:T?
public func setGenericValue(value:AnyObject!,forUndefinedKey:String){
开关钥匙{
案例“数据”:
数据=值为?T
违约:
打印(“应处理-->setGenericValue'\(值)'forUndefinedKey'\(键)'”)
}
}
public func getGenericType()->NSObject{
返回T()
}
}
错误是
return ApiClient.session.rx.request(urlRequest: MaxApiRouter.topupWall(userId: getUser()!.id!, data: body))
.convert(to: MaxResponse<Wall>.self)
返回ApiClient.session.rx.request(urlRequest:MaxApiRouter.toupwall(userId:getUser()!.id!,数据:body))
.convert(转换为:MaxResponse.self)
中提到,验证()
,不带任何参数:
自动验证200范围内的状态代码。中提到,validate()
,不带任何参数:
自动验证200以内的状态代码。您的网络请求在哪里?请也添加该部分。完成请求看起来您使用的是导入的库,而不是本机网络堆栈。你在使用Alamofire吗?是的,我在使用AlamofireOkay,这是Alamofire的问题,所以我为你更新了标签。你的网络请求在哪里?请也添加该部分。完成请求看起来您使用的是导入的库,而不是本机网络堆栈。你用的是Alamofire吗?是的,我用的是AlamofireOkay,这是Alamofire的问题,所以我为你更新了标签。
class MaxResponse<T: NSObject>: MaxResponseBase, EVGenericsKVC {
var data: T?
public func setGenericValue(_ value: AnyObject!, forUndefinedKey key: String) {
switch key {
case "data":
data = value as? T
default:
print("---> setGenericValue '\(value)' forUndefinedKey '\(key)' should be handled.")
}
}
public func getGenericType() -> NSObject {
return T()
}
}
return ApiClient.session.rx.request(urlRequest: MaxApiRouter.topupWall(userId: getUser()!.id!, data: body))
.convert(to: MaxResponse<Wall>.self)
if let responseData = response.data {
print(String(data: responseData, encoding: .utf8))
}