在 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 进行编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Alamofire 4 中进行多部分表单数据上传?

通过 Alamofire,想获取数据并将其插入 TableView,但在完成插入之前,TableView 已加载

Alamofire POST 方法不会将值传递给 url

swift中的Alamofire InvalidURL

Swift 3 Alamofire JSON 响应

根据行业惯例,我应该在进行 API 调用之前还是在 Alamofire 中进行 API 调用期间检查互联网可访问性