How to always send default parameters in HTTP request using Moya/Alamofire?
我的服务器端总是需要客户端发送令牌。作为开发人员,我可以忘记它。现在,我想提出一些解决方案,迫使我不要忘记发送这样一个必需的参数(它们将来会增长,例如,服务器可能需要设备的语言)。解决方案似乎很简单:我应该有一些
1
2 3 4 5 6 7 8 9 10 |
struct ServerManager { func request(params: [String: Any], path: String, completion: (ResponseModel) -> Void) { /// appending required default params var paramsToSend = params paramsToSend["token"] = Token.token /// making request here } |
每当我进行网络调用时,我可以毫无疑问地使用那个
但是事情变得复杂了,因为我使用
1
2 3 4 5 6 7 8 9 |
func request< T >(type: TargetType, completion: (ResponseModel< T >) -> Void) {
/// appending required default params moyaProvider.request(MultiTarget(type)) { response in /// parse it } } |
我可以简单地使用上面传递
1
2 3 |
ServerManager.shared.request(target: MovieApi.list(params)) { (response) in
} |
但上面的
这似乎是我的设计问题。有没有解决上述问题的设计模式?或者我们是否在 Moya/Alamofire 中内置了默认情况下向每个请求发送一些参数的解决方案?
通常服务器 api//’s get token 从 TTPHeaderFields 和 Moya 你可以很容易地改变你的 defaultEndpointMapping 在像 ApiGenerator 这样的一些类的一些方法:
1
2 3 4 |
static func request<T : Decodable, E: TargetType>(targetApi : E, responseModel : T.Type, success successCallBack: @escaping (Response< T >) -> Void, error errorCallBack: @escaping (Error) -> Void) -> Disposable {
… } |
在这个方法里面:
1
2 3 4 5 6 7 8 9 10 11 12 |
let endpointClosure = { (target: E ) -> Endpoint in let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target) let cookie = String(format:"JSESSIONID=%@;SPRING_SECURITY_REMEMBER_ME_COOKIE=%@", AppSettings.shared.setting.sessionId, AppSettings.shared.setting.rememberMeCookie ) return defaultEndpoint.adding(newHTTPHeaderFields: |
并将其添加到:
1
2 |
let provider = MoyaProvider<E>(endpointClosure: endpointClosure, plugins: [
NetworkLoggerPlugin(configuration: .init(logOptions: .verbose))]) |
然后做剩下的。但在您的情况下,我建议创建您的 ApiGenerator 类并在其中自定义您的 TargetApi.Task,如下所示:
1
2 3 4 5 6 |
switch defaultEndpoint.task {
case .requestParameters(parameters: /*Append new params here*/ , encoding: JSONEncoding.default): … default: … } |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/268609.html