如何始终使用Moya / Alamofire在HTTP请求中发送默认参数?

问题描述 投票:0回答:1

我的服务器端总是要求客户端发送令牌。作为开发人员,我会忘记它。现在,我想提出一些解决方案,迫使我不要忘记发送这样的必需参数(它们将来可能会增长,例如,服务器可能需要设备的语言)。解决方案似乎很简单:我应该有一些ServerManager,它可以获取参数(例如[“ user”:“ John”])和URL路径。并且还应该附加必需的参数,例如[“ token”:“ abscsdcds”]。伪代码如下所示:

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               

     }
}

[无论何时进行网络呼叫,我都可以毫无疑问地使用ServerManager发送所有必需的参数并返回响应。

但是事情变得复杂,因为我使用Moya进行网络连接。它由应实现enumerations协议的TargetType制成。我可以有很多enums,例如RateAPIMovieAPI等。这意味着我的ServerManager应该接受TargetType和使用MoyaProvider的HTTP请求。这是:

 func request<T>(type: TargetType, completion: (ResponseModel<T>) -> Void) {
              /// appending required default params 
              moyaProvider.request(MultiTarget(type)) {  response in 
                     /// parse it 
              }              



         }

我可以简单地使用传递TargetType的上述函数,它返回一个响应。我可以使用以下功能:

ServerManager.shared.request(target: MovieApi.list(params)) { (response) in

}

但是上面的params变量应始终包含令牌。这意味着每当我发出网络请求时,我都应该写params["token"] = "myToken"。这是代码重复。我想创建一些包含我所需参数的基础RequestModel。然后,我可以拥有RequestModel的不同子类,将其字段追加到所需的参数中。但是这种解决方案很容易引起误解(例如,子类可以发送自己的参数而忽略父类参数)。

似乎是我的设计难题。是否有解决上述问题的设计模式?还是我们在Moya / Alamofire中建立了内置解决方案,默认情况下会向每个请求发送一些参数?

ios swift design-patterns alamofire moya
1个回答
0
投票

通常,服务器api从TTPHeaderFields获取令牌,并且使用Moya,您可以像这样在ApiGenerator类中轻松更改defaultEndpointMapping

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:
                [
                    "X-Client": "ios",
                    "Cookie" : cookie
                ]
            )
        }

并将其添加到:

let provider = MoyaProvider<E>(endpointClosure: endpointClosure, plugins: [
            NetworkLoggerPlugin(configuration: .init(logOptions: .verbose))])

但是在您的情况下,我建议创建ApiGenerator类并像这样自定义TargetApi.Task

switch defaultEndpoint.task {
   case .requestParameters(parameters: /*Append new params here*/ , encoding: JSONEncoding.default):
       ...
    default:
       ...
 }
© www.soinside.com 2019 - 2024. All rights reserved.