Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift API调用期间从服务器获取错误消息_Swift_Generics_Alamofire_Rx Swift - Fatal编程技术网

Swift 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

我有一个应用程序,我通过扩展ObservateType将RxSwift用于我的网络。这很好,但我现在遇到的问题是,当我发出API请求时,出现错误,我无法显示从服务器发送的特定错误消息。现在,我如何获得从服务器发送的特定错误响应

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))
}