![](/img/trans.png)
[英]How to send request in Alamofire with parameters and headers using POST method in swift
[英]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
,如RateAPI
、 MovieAPI
等......這意味着我的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.