iOS:防止URL被自动转义百分比?

时间:2018-02-19 04:51:51

标签: ios swift url

我正在使用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)

但是消毒百分比仍然存在。

我花了很多时间寻找解决方案,但没有任何成功 - 任何建议?

2 个答案:

答案 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")
}