URLQueryItem 值是可选的

URLQueryItem value is optional

你好,我正在尝试将 queryItems 添加到我的 URLComponents,但是因为 URLQueryItem returns 它的值是可选的 url 一直有一个问号。

var params = ["id":"5"]
let queryParams = toStringDictionary(dictionary: params).map { pair in
    return URLQueryItem(name: pair.key, value: pair.value)
}
var components = URLComponents(string: fullURL)
components.queryItems = queryParams
print(components.url)//This is the full url https://demo.com/users/?5
                     //This https://demo.com/users/?5 should be this https://demo.com/users/5

问号当然是错的url。我无法摆脱它。

查询参数与url的其余部分用问号分隔,例如:

https://example.com/path?param_name=param_value

问号不是可选的,而是提供查询参数的方式。

您评论中的示例似乎丢失了参数名称,我希望它显示为

https://demo.com/users/?id=5

如果它确实不包含 id= 位,请您分享 toStringDictionary 的实现,以便我们了解那里发生了什么?你传入的字典已经是一个字符串字典,所以有这样的功能似乎很奇怪。

编辑:根据您的说明(现在已经消失,但明确表示您要添加到路径而不是查询字符串)

看起来你的代码添加查询参数是正确的;仔细观察它产生的 URL,它将是 https://demo.com/users/?id=5。查询参数不是路径的一部分,它们位于末尾,并通过 ?

与 URL 的其余部分分开

从您的编辑来看,您实际上想要做的似乎是添加到 URL 的路径,以便您得到 https://demo.com/users/5。 URL 没有任何查询参数,因此 URLQueryItem 是错误的工具。

要添加到路径,您可以执行如下操作:

let userID = "5"
let url = URL(string: "https://example.com/users")!
let newUrl = url.appendingPathComponent(userID)
print(newUrl.absoluteString) //https://example.com/users/5

NB - url 只是为了简洁起见在示例中强制解包,因为已知传递给 URL() 的字符串是有效的。在实际使用中,你应该更小心地对待可选的。

你的toStringDictionary

有问题

假设

let fullURL = "https://demo.com/users/"

您需要做的就是……

let queryParams = params.map{ URLQueryItem(name: [=11=], value: ) }

var components = URLComponents(string: fullURL)!
components.queryItems = queryParams
print(components.url!)

// https://demo.com/users/?id=5

注意在实践中要避免力展开