首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxAlamofire -如何获取错误响应?

RxAlamofire -如何获取错误响应?
EN

Stack Overflow用户
提问于 2018-04-20 18:15:46
回答 1查看 1.5K关注 0票数 5

当RxAlamofire调用中出现错误时,我需要响应体。我见过this hack,但我想知道是否有更干净的方法。

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

代码语言:javascript
复制
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)")
      }
    }
  }
)
EN

回答 1

Stack Overflow用户

发布于 2018-05-01 20:35:51

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

我以如下方式做了一个hack:

添加了PError:

代码语言:javascript
复制
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添加了这样的扩展:

代码语言:javascript
复制
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)
            }
        }
    }

接下来,在代码中的某个地方,您将能够使用这个自定义错误对象:

代码语言:javascript
复制
if let err = error as? PError {
                status = err.message ?? "No message in the error description"
            }
            else
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49939309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档