使用URLComponents
's时queryItems
,我发现如果您有一个查询项,其值包含一定百分比的编码字符,在我的情况下 a/
被编码为%2F
,那么如果您从包含此类查询项URLComponents
的 URL 构造一个对象,则改变对象String
的查询项列表URLComponents
,然后如果您尝试URL
通过调用对象来获取 a .url
,URLComponents
那么查询项将丢失其百分比编码。
这是我在操场上测试的代码:
import UIKit
// --- Part 1 ---
print("--- Part 1 ---\n")
let startURL = "https://test.com/test.jpg?X-Test-Token=FQdzEPH%2F%2F%2F"
var components = URLComponents(string: startURL)!
if let compURL = components.url {
print(URL(string: startURL)! == compURL) // True
print(startURL)
print(compURL)
}
// --- Part 2 ---
print("\n--- Part 2 ---\n")
let startURLTwo = "https://test.com/test.jpg?X-Test-Token=FQdzEPH%2F%2F%2F"
let finalURL = "https://test.com/test.jpg?X-Test-Token=FQdzEPH%2F%2F%2F&foo=bar"
var componentsTwo = URLComponents(string: startURLTwo)!
let extraQueryItem = URLQueryItem(name: "foo", value: "bar")
componentsTwo.queryItems!.append(extraQueryItem)
if let compURLTwo = componentsTwo.url {
print(URL(string: finalURL)! == compURLTwo) // False
print(finalURL)
print(compURLTwo)
}
如果这样可以更容易地理解正在发生的事情,这是一张图片: