swift - 在 API 调用期间从服务器获取错误消息

标签 swift generics alamofire rx-swift

我有一个应用程序,我通过扩展 ObservableType 将 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
}

来自服务器的响应可能是

{
  "status" : "error",
  "message" : " INSUFFICIENT_FUNDS"
}

{
  "status" : "success",
  "data" : " gghfgdgchf"
}

我的回复是这样处理的

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)

最佳答案

official Alamofire docs提到validate()没有任何参数:

Automatically validates status code within 200..<300 range, and that the Content-Type header of the response matches the Accept header of the request, if one is provided.

所以如果你不包括 Alamofire 的 validate() 你是说无论状态码如何,如果请求确实通过了,你就会认为它成功了,所以这就是为什么它在失败 block 。

但是,如果您更喜欢使用它,是的,它会给您一个 ResponseValidationFailureReason 错误,但您仍然可以访问 response.data。尝试打印它,您应该看到来自服务器的预期错误响应:

if let responseData = response.data {
    print(String(data: responseData, encoding: .utf8))
}

关于swift - 在 API 调用期间从服务器获取错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865017/

相关文章:

ios - 如何使用 AlamoFire/ObjectMapper 访问嵌入在 JSON 字典中的链接?

ios - 调试 Alamofire 请求

xml - Alamofire XML解析错误-1017

ios - 歧义使用下标 xcode 7.1

swift - 设置<NSObject >' does not have a member named ' allObjects'

objective-c - Swift 与 ARC 之前的 Objective-C 不兼容吗?

java - 逆变转换 Guava 谓词

swift - 使用有符号整数而不是无符号整数

java - Java中获取泛型类型的类

c# - 在 C# 中将对象 T 转换为 List<T>