我正在使用URLSession.dataTask
获取一些JSON数据。要过滤数据,我使用的是一个按日期限制的参数。 API使用方括号,例如
https://foo.com/api/items.json?find[date]=...
。
但是,在创建包含字符串的URL并从中请求数据时,方括号会自动转义:
https://foo.com/api/items.json?find%5Bdate%5D=...
括号转义后,API无法识别请求。
我已尝试明确删除百分比编码以创建新网址,即
let unsanitized = URL(string: url.absoluteString.removingPercentEncoding)
但是消毒百分比仍然存在。
我花了很多时间寻找解决方案,但没有任何成功 - 任何建议?
答案 0 :(得分:4)
根据URI的规范:"由Internet协议文字地址,版本6 [RFC3513]或更高版本标识的主机通过将IP文字括在方括号内来区分(" [&#34] ;和"]")。" rfc3986.
因此,您不能使用方括号来实现您的目的而不会逃避它们。您的服务器的REST服务因未处理查询参数中的转义字符而出错。 (而且我最近遇到的情况是,我不得不要求我的REST团队解决这类问题,因为他们忘记支持转义的查询参数值。)
答案 1 :(得分:0)
请尝试使用URLComponents的percentEncodedQueryItems
代替queryItems
。
这是我在应用程序中的代码。
let fullUrl = baseURL.appendingPathComponent(path)
guard var components = URLComponents(url: fullUrl, resolvingAgainstBaseURL: false) else {
fatalError("Unable to create URL components")
}
var params = self.parameters // <-- parameters = [String:String]
params["serviceKey"] = Const.OPEN_API_KEY // <-- percent encoded key
components.percentEncodedQueryItems = params.map { // <-- already percent encoded Query Items
URLQueryItem(name: String($0), value: String($1))
}
guard let url = components.url else {
fatalError("Could not get url")
}