Swift URL appendingPathComponent 将 `?` 转换为 `%3F`

Паш*_*хин 11 url ios swift swift4

let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url?.appendingPathComponent(path)
Run Code Online (Sandbox Code Playgroud)

追加后,路径/somePath?变为somePath%3F

?成为一个%3F。问号替换为百分比编码的转义字符。

如果我使用,URL 会正确输出:

let urlFormString = URL(string:"https://example.com/somePath?")
Run Code Online (Sandbox Code Playgroud)

为什么appendingPathComponent转换?%3F

appendingPathComponent如果路径组件包含问号,我该如何使用?

Sul*_*han 11

URL 的通用格式如下:

scheme:[//[userinfo@]host[:port]]path[?query][#fragment]
Run Code Online (Sandbox Code Playgroud)

您必须意识到的是,?不是path. 它是path和之间的分隔符query

如果您尝试添加?到路径,它必须是 URL 编码的,因为?它不是路径组件的有效字符。

最好的解决方案是?path. 它在那里没有意义。但是,如果您有一个部分 URL 想要附加到基本 URL,那么您应该将它们作为字符串加入:

let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url.flatMap { URL(string: $0.absoluteString + path) }
Run Code Online (Sandbox Code Playgroud)

简而言之,appendingPathComponent不是应该用于追加 URL 查询的函数。


Bap*_*tya 6

你应该removingPercentEncoding在 URL 上使用absoluteString

let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url?.appendingPathComponent(path).absoluteString.removingPercentEncoding
print(urlWithPath!)
Run Code Online (Sandbox Code Playgroud)

  • 除非 `URL` 包含其他应该被 URL 编码的字符,否则这个“解决方案”会中断。 (2认同)