URLQueryItem值是可选的

Emi*_*irC 2 ios swift urlsession

您好我正在尝试将queryItems添加到我的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
Run Code Online (Sandbox Code Playgroud)

问号当然会导致错误的网址.我无法摆脱它.

Jos*_*ald 7

查询参数通过问号与网址的其余部分分隔,例如:

https://example.com/path?param_name=param_value
Run Code Online (Sandbox Code Playgroud)

问号不是由于可选项,而是提供查询参数的方式.

您的评论中的示例看起来已经丢失了参数的名称,我希望它能够阅读

https://demo.com/users/?id=5
Run Code Online (Sandbox Code Playgroud)

如果它肯定不包含该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
Run Code Online (Sandbox Code Playgroud)

NB - url在示例中仅为了简洁而强制解包,因为传递给URL()的字符串已知有效.在实际使用中,您应该更仔细地对待可选项.