簡體   English   中英

如何始終使用 Moya/Alamofire 在 HTTP 請求中發送默認參數?

[英]How to always send default parameters in HTTP request using Moya/Alamofire?

我的服務器端始終需要客戶端發送令牌。 作為開發人員,我可以忘記它。 現在,我想提出一些解決方案,迫使我不要忘記發送這樣一個必需的參數(它們將來會增長,例如,服務器可能需要設備的語言)。 解決方案似乎很簡單:我應該有一些ServerManager來獲取參數(例如,[“user”:“John”])和 URL 路徑。 並且它還應該 append 所需的參數,例如,["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進行聯網。 它由應該實現TargetType協議的enumerations組成。 我可以有幾十個enums ,如RateAPIMovieAPI等......這意味着我的ServerManager應該使用MoyaProvider接受TargetType和 HTTP 請求。 這里是:

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



         }

我可以簡單地使用上面的 function 傳遞TargetType並返回一個響應。 我可以使用上面的 function 如下:

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

}

但是上面的params變量應該總是包含令牌。 這意味着每當我發出網絡請求時,我都應該寫params["token"] = "myToken" 這是代碼重復。 我想創建一些包含我所需參數的基本RequestModel 然后我可以擁有RequestModel的不同子類,將其字段附加到所需的參數。 但是這種解決方案很容易被誤導(例如,子類可以發送自己的參數而忘記了父 class 參數)。

看來我的設計問題。 有沒有解決上述問題的設計模式? 或者我們是否在 Moya/Alamofire 中內置了默認情況下向每個請求發送一些參數的解決方案?

通常服務器 api 從 TTPHeaderFields 獲取令牌,並且使用 Moya,您可以使用以下方法輕松更改 Some class 中的defaultEndpointMapping ,例如ApiGenerator

static func request<T : Decodable, E: TargetType>(targetApi : E, responseModel : T.Type, success successCallBack: @escaping (Response<T>) -> Void, error errorCallBack: @escaping (Error) -> Void) -> Disposable {
    ...

    }

在這個方法里面:

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))])

並做 rest。 但在您的情況下,我建議創建您的 ApiGenerator class 並在其中自定義您的TargetApi.Task ,如下所示:

switch defaultEndpoint.task {
   case .requestParameters(parameters: /*Append new params here*/ , encoding: JSONEncoding.default):
       ...
    default:
       ...
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM