尝试调用内部有一些特殊字符的url字符串请求时遇到了一些问题。例如,对于CharacterSet,当在URL中有%20
表示空格键时,我使用addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
函数将其替换为%2520
。你们可以尝试这段代码:
let url = "http://analytics.abc.io/acct?start_date=2017-11-15&aff=ABC%20Telecom"
url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(URL(string: url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!)
实际上它的请求是成功的,但响应数据是错误的。任何人都可以给我一些想法以及如何解决这个问题。
除此之外,请给我一些关于我不使用它的URLQueryItem的评论,所以我需要你的帮助。谢天谢地!
答案 0 :(得分:6)
老实说,如果使用URLComponents进行分解,它会好100%。它将为您和下一个开发人员阅读代码提供便利。
let host = "analytics.abc.io"
let scheme = "http"
let path = "/acct"
var urlQueryItems : [URLQueryItem] = []
for (key, value) in [("start_date", "2017-11-15"), ("aff", "ABC Telecom")] {
urlQueryItems.append(URLQueryItem(name: key, value: value))
}
var result = URLComponents()
result.host = host
result.scheme = scheme
result.path = path
result.queryItems = urlQueryItems
print(result.url)
//prints : Optional(http://analytics.abc.io/acct?start_date=2017-11-15&aff=ABC%20Telecom)
答案 1 :(得分:1)
请改变下面的行
(url.addingPercentEncoding( withAllowedCharacters: .urlUserAllowed))!
希望它有所帮助。
答案 2 :(得分:1)
我遇到了同样的问题,我解决了使用followint技巧
let url = "http://analytics.abc.io/acct?start_date=2017-11-15&aff=ABC%20Telecom"
if url.contains(" ") {
url = urlSTR.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
}
有时我们已经从服务器编码了url然后它会产生一些问题。所以最好的解决方案是让你的服务器人员提供没有编码的url并从app端管理它。 希望它有所帮助。
答案 3 :(得分:1)
请勿强行打开任何内容,请使用if..let
或guard
let url = "http://analytics.abc.io/acct?start_date=2017-11-15&aff=ABC%20Telecom"
if let finalURL = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
//Do your stuff
}