URLQueryItem 值是可选的



您好,我正在尝试将查询项添加到我的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

请注意,在实践中应避免强制展开

相关内容

  • 没有找到相关文章

最新更新