您好,我正在尝试将查询项添加到我的URLComponents中,但由于URLQueryItem将其值作为可选返回,因此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 的其余部分用问号分隔,例如:
https://example.com/path?param_name=param_value
问号不是由于可选,而是提供查询参数的方式。
您评论中的示例看起来丢失了参数的名称,我希望它显示为
https://demo.com/users/?id=5
如果它绝对不包括id=
位,请您分享toStringDictionary
的实现,以便我们可以看到那里发生了什么?您传入的字典已经是字符串字典,因此具有这样的功能似乎很奇怪。
编辑:根据您的澄清(现在已经消失,但明确表示您希望添加到路径而不是查询字符串(
看起来您的代码正在正确添加查询参数;仔细观察它生成的 URL,它将https://demo.com/users/?id=5
。查询参数不是路径的一部分,它们位于末尾,并通过 ?
从您的编辑来看,您实际上想要做的似乎是添加到 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
注意 -url
在示例中只是为了简洁起见而强制解包,因为传递给 URL(( 的字符串已知是有效的。在实际使用中,您应该更仔细地对待可选。
你的toStringDictionary
有问题
若
let fullURL = "https://demo.com/users/"
您需要做的就是...
let queryParams = params.map{ URLQueryItem(name: $0, value: $1) }
var components = URLComponents(string: fullURL)!
components.queryItems = queryParams
print(components.url!)
// https://demo.com/users/?id=5
请注意,在实践中应避免强制展开