在 Alamofire 中使用之前对 URL 进行编码

Nev*_*ani 0 swift swift4

现在我正在使用参数发出 Alamofire 请求。在发出请求之前我需要最终 URL,因为我需要散列最终 URL 并将其添加到请求标头中。我就是这样做的,但它没有给我最终的 URL 来散列并放入标题中。

Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON
Run Code Online (Sandbox Code Playgroud)

我想在发出此请求之前获取编码的 URL,因此请求如下所示

Alamofire.request(url, method: .get, headers: headers).responseJSON
Run Code Online (Sandbox Code Playgroud)

现在作为一种解决方法,我通过手动附加每个参数来手动创建 URL。有没有更好的方法来做到这一点?

let rexUrl = "https://www.google.com"
let requestPath = "/accounts"
let url = rexUrl + requestPath + "?apikey=\(apiKey)&market=USD&quantity=\(amount)&rate=\(price)&nonce=\(Date().timeIntervalSince1970)"
Run Code Online (Sandbox Code Playgroud)

pbo*_*dsk 6

您可以使用URLComponents轻松添加 URL 参数等,而不是“手动”编写自己的 URL 。

这是使用上面的 URL 的示例:

var apiKey = "key-goes-here"
var amount = 10 
var price = 20
var urlParameters = URLComponents(string: "https://google.com/")!
urlParameters.path = "/accounts"

urlParameters.queryItems = [
    URLQueryItem(name: "apiKey", value: apiKey),
    URLQueryItem(name: "market", value: "USD"),
    URLQueryItem(name: "quantity", value: "\(amount)"),
    URLQueryItem(name: "rate", value: "\(price)"),
    URLQueryItem(name: "nonce", value: "\(Date().timeIntervalSince1970)")
]

urlParameters.url //Gives you a URL with the value https://google.com/accounts?apiKey=key-goes-here&market=USD&quantity=10&rate=20&nonce=1513630030.43938
Run Code Online (Sandbox Code Playgroud)

当然,它并没有让您的生活变得更轻松,因为您仍然需要URL自己编写代码,但至少您不必再为添加&?以正确的顺序而苦苦挣扎了。

希望能帮到你。