我在我的swift应用程序中使用Moya来处理网络请求。
我可以使用Moya-Object Mapper获取请求并映射结果。
我之前使用过alamofire,我熟悉如何发帖,获取请求和阅读响应标题。
然而,我似乎无法理解我如何在Moya中做同样的事情。
我确实浏览了文档,但没有说明阅读响应标题。
是否有任何示例或教程,我可以按照如何进行HTTP身份验证并阅读响应标头。还有我如何发布帖子请求并将参数作为字段参数或json body发送。
我已经完成了Moya的例子。
任何帮助将不胜感激。谢谢。
答案 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}}