在 Alamofire 中使用之前对 URL 进行编码
Posted
技术标签:
【中文标题】在 Alamofire 中使用之前对 URL 进行编码【英文标题】:Encode URL before using in Alamofire 【发布时间】:2017-12-18 20:29:07 【问题描述】:现在我正在使用参数发出 Alamofire 请求。在发出请求之前我需要最终 URL,因为我需要对最终 URL 进行哈希处理并将其添加到请求标头中。我就是这样做的,但它没有给我最终的 URL 来散列并放入标题中。
Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON
我想在发出此请求之前获取编码的 URL,因此请求看起来像这样
Alamofire.request(url, method: .get, headers: headers).responseJSON
现在作为一种解决方法,我通过手动附加每个参数来手动创建 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)"
【问题讨论】:
***.com/questions/24551816/swift-encode-url/… 【参考方案1】:您可以使用 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
当然,这并没有让你的生活变得更轻松,因为你仍然需要自己编写URL
,但至少你不必再为按正确顺序添加&
和?
而苦苦挣扎.
希望对你有所帮助。
【讨论】:
这太棒了!为什么要在已经是字符串的项目周围加上“/()”? @NevinJethmalani 是对的 :)URLComponents
是一个很棒的 URL 工具。关于“在 () 中包装字符串”,对不起...复制粘贴 :) 我现在已经更改了【参考方案2】:
这是一个将字典参数转换为 URL 编码字符串的简洁函数。但是您必须将参数放入字典中。
func url(with baseUrl : String, path : String, parameters : [String : Any]) -> String?
var parametersString = baseUrl + path + "?"
for (key, value) in parameters
if let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed),
let encodedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
parametersString.append(encodedKey + "=" + "\(encodedValue)" + "&")
else
print("Could not urlencode parameters")
return nil
parametersString.removeLast()
return parametersString
然后你就可以这样使用了
let parameters : [String : Any] = ["apikey" : "SomeFancyKey",
"market" : "USD",
"quantity" : 10,
"rate" : 3,
"nonce" : Date().timeIntervalSince1970]
self.url(with: "https://www.google.com", path: "/accounts", parameters: parameters)
这将为您提供输出:
"https://www.google.com/accounts?apikey=SomeFancyKey&quantity=10&market=USD&nonce=1513630655.88432&rate=3"
【讨论】:
以上是关于在 Alamofire 中使用之前对 URL 进行编码的主要内容,如果未能解决你的问题,请参考以下文章