【发布时间】:2018-11-09 13:03:19
【问题描述】:
如何使用 (Rx) Moya 将默认请求参数(例如 AppID)附加到每个 API 调用?
【问题讨论】:
标签: swift alamofire rx-swift moya
如何使用 (Rx) Moya 将默认请求参数(例如 AppID)附加到每个 API 调用?
【问题讨论】:
标签: swift alamofire rx-swift moya
Moya 中的Endpoint 类有adding(newHTTPHeaderFields:),它需要一个字典,在这里您可以提供您的附加http 标头,这些标头将为每个请求发送。文档link
let endpointClosure = { (target: TargetType) -> Endpoint in
let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
return defaultEndpoint.adding(newHTTPHeaderFields: ["AppID": "MY_APP_ID"])
}
let provider = MoyaProvider<TargetType>(endpointClosure: endpointClosure)
【讨论】:
//Create a BaseMoyaProvider class and add default paramaters
import Moya
import Result
import SwiftyJSON
class BaseMoyaProvider {
static func create<T: TargetType>(service: T.Type) -> (T)->(Endpoint) {
let closure = { (target: T) -> Endpoint in
let endpoint = MoyaProvider.defaultEndpointMapping(for: target)
switch endpoint.task {
case .requestParameters(
let _parameters,
let _encoding):
let parameters = _parameters
.appending([
"AppID" : "XXXXXXXXXXX"
])
let task = Task.requestParameters(
parameters: parameters,
encoding: _encoding
)
return endpoint
.replacing(task: task)
default: return endpoint
}`enter code here`
}
return closure
}
}
//Extend MoyaProvider class
extension MoyaProvider {
static func build() -> MoyaProvider<Target> {
let provider = BaseMoyaProvider
.create(service: Target.self)
return MoyaProvider<Target>(
endpointClosure: provider,
plugins: [ ApiLogger() ]
)
}
// MARK: Request
func rx_request<T: Mappable>(_ target: Target) -> Observable<T> {
return Observable.create({ (observer) -> Disposable in
let request = self.request(target, completion: { (result) in
//Handle response
})
return Disposables.create {
request.cancel()
}
})
}
}
【讨论】: