获得 Moya 的回复 header

Get response header with Moya

我在 swift 应用程序中使用 Moya 进行网络请求。

我能够使用 Moya-Object Mapper 获取请求并映射结果。

我之前使用过 alamofire,我熟悉如何制作 post、获取请求和读取响应 headers。

但是,我似乎无法理解如何在 Moya 中做同样的事情。

我确实浏览了文档,但它没有说明阅读回复 headers。

是否有任何示例或教程可以让我了解如何进行 HTTP 身份验证并阅读响应 headers。以及如何发出 post 请求并将参数作为字段参数或 json body.

发送

我已经完成了 Moya 示例。

如有任何帮助,我们将不胜感激。谢谢。

Moya 中的响应header 其实暂时还挺难的。这是 Moya 代码中不需要的旧的沮丧。我一直不知道他们为什么不看好它。

我开了一个相关的issue来指出:Moya header

并通过拉取请求进行一些更改:Moya header PR

这是我的个人代码示例,我在其中强制转换响应以访问 headers:

class GetTokenRequest {

    private let requestService = AuthorizedRequest()

    func request() -> Observable<AuthorizedResult<GetTokenEntityResult>> {
        return Observable.deferred { [weak self] in
            guard let wself = self else {
                return Observable.empty()
            }

            let req = wself.requestService.makeRawRequest { userId in
                    let obj = GetTokenEntity(lang: currentLanguage(), userId: userId)
                    return MtxAPI.getToken(obj)
                }
                .shareReplay(1)

            return req.map { result in
                switch result {
                case .success(let response):
                    let urlResponse = response.response as! HTTPURLResponse
                    guard let token = urlResponse.allHeaderFields["Token"] as? String else {
                        return AuthorizedResult.fail(RequestError.technical)
                    }
                    return AuthorizedResult.success(GetTokenEntityResult(token: token))

                case .fail(let error): return AuthorizedResult.fail(error)
                }
            }
        }
    }

}

我正在使用 RxSwift 但主线是:

let urlResponse = response.response as! HTTPURLResponse

您可以在收到响应(Moya.Response)时使用的 map/mapObject/mapArray 中强制转换它

我建议您关注我提出的问题,以了解它何时会在包含此内容的下一个版本中实现 breaking change

奖励:如果你在你的项目中使用 SwiftLint,你可以使用 guard/let

guard let resp = response.response as? HTTPURLResponse

如果有人仍然对使用 Moya 时如何获取 url 请求对象感兴趣,这里是另一个实现:

extension NetworkApiService {
public var urlRequest: URLRequest {
    let defaultURL: URL
    if path.isEmpty {
        defaultURL = baseURL
    } else {
        defaultURL = baseURL.appendingPathComponent(path)
    }

    let endpoint = MoyaProvider.defaultEndpointMapping(for: self)
    do {
        return try endpoint.urlRequest()
    } catch {
        return URLRequest(url: defaultURL)
    }
}
}

其中NetworkApiService符合Moya的TargetType协议。

请注意,返回的实例与 Moya 引擎调用的 URLRequest 对象并不完全相同,但它是使用 Moya 的 API 实例化的,并且与原始实例具有相同的配置。

在 Moya 中获得响应 headers 的最简单方法是

switch result {
case let .success(moyaResponse):
     if(moyaResponse.statusCode == 200) {
          let response = moyaResponse.response
          let responseHeaderDictionary = response?.allHeaderFields
     }
}