0

我在我的 swift 应用程序中使用 Moya 来处理网络请求。

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

我之前使用过 alamofire,我熟悉如何发布、获取请求和阅读响应标头。

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

我确实浏览了文档,但它没有说明读取响应标头的任何内容。

是否有任何示例或教程可以让我了解如何进行 HTTP 身份验证并读取响应标头。以及如何发出发布请求并将参数作为字段参数或 json 正文发送。

我已经浏览了 Moya 的例子。

任何帮助将不胜感激。谢谢你。

4

3 回答 3

3

Moya 中的响应标头目前实际上相当困难。这是 Moya 代码中不受欢迎的旧式沮丧。我永远不知道他们为什么贬低它。

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

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

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

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

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

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

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

guard let resp = response.response as? HTTPURLResponse
于 2017-05-03T08:47:10.110 回答
0

在 Moya 中获取响应头的最简单方法是

switch result {
case let .success(moyaResponse):
     if(moyaResponse.statusCode == 200) {
          let response = moyaResponse.response
          let responseHeaderDictionary = response?.allHeaderFields
     }
}
于 2019-02-12T05:03:04.787 回答
0

如果有人在使用 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)
    }
}
}

WhereNetworkApiService符合 Moya 的TargetType协议。

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

于 2018-11-12T10:09:01.457 回答