我今天遇到了一个烦人的问题。我正在做一个应用程序,可以查询自制的 API 并解析答案,一个非常经典的应用程序。
但是由于我收到的大量数据,我想对我的请求应用过滤器"<="和">=",但它不起作用。生成的 URL 对象是nil
。
这是代码:
print(request.url) // prints the expected URL
var uerel = URL(string: request.url)
print(uerel) // prints 'nil'
输出:
https://XXXXXXX.eu/YYYYYY?my_filter_id=5b057e27443318329d694d64&date>=2016-01-01T08:00:00.000Z&date<=2016-01-01T20:00:00.000Z
nil
有趣的是,如果我去掉<
和>
,它就像一个魅力。 我试图在官方文档中搜索 URL 对象,但它似乎不需要特殊的编码......?
我还查看了上述官方文档中提到的 RFC 1808,这些特殊字符被标记为punctuation
所以我相信将它们放在 URL 中是可以的。
问题从何而来?
您需要对该 URL 进行编码,因为<
和>
符号在URL
中无效。
let unencodedUrlString = "https://XXXXXXX.eu/YYYYYY?my_filter_id=5b057e27443318329d694d64&date>=2016-01-01T08:00:00.000Z&date<=2016-01-01T20:00:00.000Z"
guard let encodedUrlString = unencodedUrlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: encodedUrlString) else { return }
编码的 URL 将不包含<
和>
符号,如您所见:
https://XXXXXXX.eu/YYYYYY?my_filter_id=5b057e27443318329d694d64&date%3E=2016-01-01T08:00:00.000Z&date%3C=2016-01-01T20:00:00.000Z