通过HTTPHeader设置公共请求参数
在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包.
let endpointClosure = { (target: T) -> Endpoint<T> in
let url = target.baseURL.appendingPathComponent(target.path).absoluteString
let endpoint = Endpoint<T>(url: url, sampleResponseClosure: {
.networkResponse(200, target.sampleData) },
method: target.method,
parameters: target.parameters,
parameterEncoding: target.parameterEncoding)
return endpoint.adding(newHTTPHeaderFields:
["x-platform" : "iOS",
"x-interface-version" : "1.0"])}
然后在创建请求的Provider把它添加上去
let provider = RxMoyaProvider<APIManager>(endpointClosure: endpointClosure)
通过插件的方式监听网络状态
通常我们会在进行网络请求的时候进行一些状态展示,如loading,那么你可以通过插件的方式来实现。Moya默认有4个插件:
AccessTokenPlugin 管理AccessToken的插件
CredentialsPlugin 管理认证的插件
NetworkActivityPlugin 管理网络状态的插件
NetworkLoggerPlugin 管理网络log的插件
在这里就演示一下NetworkActivityPlugin的使用:
let networkPlugin = NetworkActivityPlugin { (type) in
switch type {
case .began:
print("显示loading")
case .ended:
print("隐藏loading")
}
}
同样在创建请求的Provider把它添加上去即可
let provider = RxMoyaProvider<APIManager>(plugins:[networkPlugin])
当然你也可以自定义一些功能的插件,只需要实现PluginType协议,具体功能实现可参考Moya默认的插件:
final class CustomPlugin: PluginType {
// MARK: Plugin
}
设置接口的超时时间
一般网络的请求需要根据具体的业务接口设置合适的超时时间,你可以参照一下方法进行设置
let requestClosure = { (endpoint: Endpoint<T>, done: @escaping MoyaProvider<T>.RequestResultClosure) in
guard var request = endpoint.urlRequest else { return }
request.timeoutInterval = 30 //设置请求超时时间
done(.success(request))
}
同样在创建请求的Provider把它添加上去即可
let provider = RxMoyaProvider<APIManager>(requestClosure: requestClosure)
最后,这些设置最好用一个 struct 去管理.
Example:
struct HttpArgument<T: TargetType> {
let endpointClosure = .....
let requestClosure = ......
let networkPlugin = ......
let accessTokenPlugin = .....
}
使用的时候
private lazy var provider: RxMoyaProvider = { () -> RxMoyaProvider<APIManager> in
let argument = HttpArgument<APIManager>()
let provider = RxMoyaProvider<APIManager>(endpointClosure: argument.endpointClosure,
plugins:[argument.networkPlugin])
return provider
}()