提问者:小点点

使用Moya获取响应报头


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

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

我以前使用过alamofire,我熟悉如何进行post,获取请求和阅读响应头。

然而,我似乎无法理解我怎么能在莫亚也这样做。

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

有没有任何例子或教程,我可以遵循如何做一个HTTP身份验证和读取响应头。以及如何发出post请求并将参数作为字段参数或json主体发送。

我已经看过Moya的例子了。

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


共3个答案

匿名用户

Moya中的响应头实际上目前相当困难。这是莫亚密码里一个不受欢迎的老掉牙。我不知道他们为什么会轻视它。

我打开一个相关问题指出:莫亚头

并做一些更改感谢一个拉请求: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中强制广播它

我建议您跟踪我提出的问题,知道它何时会在下一个版本中实现,下一个版本将包含这个

好处:如果您在项目中使用SwiftLint,您可以使用强制转换它

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

其中符合Moya的协议。

请注意,返回的实例与Moya's engine调用的对象不完全相同,而是使用Moya's API实例化的,并且具有与原始实例相同的配置。

匿名用户

null

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