获取Moya的回复标题

时间:2017-05-03 06:12:01

标签: ios swift http post moya

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

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

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

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

我确实浏览了文档,但没有说明阅读响应标题。

是否有任何示例或教程,我可以按照如何进行HTTP身份验证并阅读响应标头。还有我如何发布帖子请求并将参数作为字段参数或json body发送。

我已经完成了Moya的例子。

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

3 个答案:

答案 0 :(得分:2)

莫亚的回应标题实际上目前很难。在Moya代码中,这是一个不受欢迎的旧贬低。我不知道他们为什么会低估它。

我打开了一个相关问题来指出: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中强制播放它(Moya.Response

我建议您按照我提出的问题来了解它将在下一个版本中实施的时间,该版本将包含此breaking change

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

进行投射
guard let resp = response.response as? HTTPURLResponse

答案 1 :(得分:0)

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

CrawlerService

import win32com.client shell = win32com.client.Dispatch("WScript.Shell") sapgui = win32com.client.GetObject("SAPGUI") system = query.get('system') client = query.get('mandant') session = False application = sapgui.GetScriptingEngine seen = [] for i_conn in range(0, application.Connections.Count): seen.append('i_conn=%s session_count=%s' % (i_conn, application.Connections.Item(i_conn).Sessions.Count)) for i_sess in range(0, application.Connections.Item(i_conn).Sessions.Count): session_info = application.Connections.Item(i_conn).Sessions.Item(i_sess).Info system_of_session = session_info.SystemName client_of_session = session_info.Client if system_of_session == system and client_of_session == client: connection = application.Connections.Item(i_conn).Children(i_sess) session = connection.Children(i_sess) break seen.append('system=%s client=%s' % (system_of_session, client_of_session)) if session: break else: info_popup('You are not logged into system %s in Client %s! Seen:\n%s' % ( system, client, '\n'.join(seen))) return 符合Moya的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的引擎调用的NetworkApiService对象并不完全相同,但是使用Moya的API实例化了该实例,并且其配置与原始实例相同。

答案 2 :(得分:0)

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

{{1}}