我应该使用 CharacterSet 还是 URLQueryItem?

Should I use CharacterSet or URLQueryItem?

当我尝试调用一个包含特殊字符的 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 的评论,我没有使用它,所以我需要你的帮助。感谢和加油!

请将您的线路更改为以下内容

(url.addingPercentEncoding( withAllowedCharacters: .urlUserAllowed))!

希望对您有所帮助。

我遇到了同样的问题,我使用跟随技巧解决了

let url = "http://analytics.abc.io/acct?start_date=2017-11-15&aff=ABC%20Telecom"
    if url.contains(" ") {
            url = urlSTR.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        }

有时我们得到 url 已经从服务器编码然后它创建一些 problem.so 最好的解决方案是让你的服务器人员提供 url 没有编码并从应用程序管理它结尾。 希望对你有帮助。

不要强行打开任何东西,使用if..letguard

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
}

老实说,如果使用 URLComponents 进行分解,会不会好 100%。方便你和下一个dev阅读代码的工作。

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)