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

qgelzfjb  于 2022-09-19  发布在  Swift
关注(0)|答案(7)|浏览(279)
let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url?.appendingPathComponent(path)

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

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

如果我使用以下命令,URL将正确输出:

let urlFormString = URL(string:"https://example.com/somePath?")

为什么appendingPathComponent要将?转换为%3F

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

8dtrkrch

8dtrkrch1#

URL的通用格式如下:

scheme:[//[userinfo@]host[:port]]path[?query][#fragment]

您必须意识到,?不是path的一部分。它是pathquery之间的分隔符。

如果尝试将?添加到路径,则必须对其进行URL编码,因为?不是路径组件的有效字符。

最好的解决方案是从path中删除?。在那里它没有任何意义。但是,如果您有要追加到基本URL的部分URL,则应将它们作为字符串联接:

let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url.flatMap { URL(string: B1a1a1b.absoluteString + path) }

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

zbsbpyhn

zbsbpyhn2#

您应该在URL的absoluteString上使用removingPercentEncoding

let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url?.appendingPathComponent(path).absoluteString.removingPercentEncoding
print(urlWithPath!)
e1xvtsh3

e1xvtsh33#

根据URL编码,%3F代表?。因此,如果你创建一个URL--它必须是这样的。如果出于某种原因,您需要?,请创建一个字符串,而不是URL。

检查urlWithPath.lastPathComponent以查看是否一切正常(打印:“omePath?”)

uxhixvfz

uxhixvfz4#

首先,这不是一个问题。这是一种称为URL编码的机制,用于将不可打印或特殊的字符转换为Web服务器和浏览器普遍接受的格式。

有关更多信息,请访问https://www.techopedia.com/definition/10346/url-encoding

URL编码字符,https://www.degraeve.com/reference/urlencoding.php

olmpazwi

olmpazwi5#

当您将字符串转换为URL时,它将在URL中执行PercentEnding。因此,您的?已被编码为%3F

如果您希望URL为包含?的字符串,您可以删除PercentEnding,如下所示。

let urlString = urlWithPath?.absoluteString.removingPercentEncoding

Output: https://example.com/somePath?

5uzkadbs

5uzkadbs6#

您可以使用NSString类构建您的URL:

let urlStr = "https://example.com" as NSString
let path = "/somePath?"
let urlStrWithPath = urlStr.appendingPathComponent(path)
let url = URL(string: urlStrWithPath)

这样,特殊字符就不会在最终的URL中进行URL编码。

ar7v8xwq

ar7v8xwq7#

可以使用URLComponents而不是URL:

var url = URLComponents()

设置方案、主机、路径:

url.scheme = "https"
url.host = "example.com"
url.path = "/somePath"

将查询设置为空字符串和?是添加的,因为它是路径和查询之间的分隔符:

url.query = ""
// url.queryItems = [URLQueryItem(name: "nameN", value: "valueX")]

打印:https://example.com/somePath?

print(url)

相关问题