将筛选器"Less-than or equal"应用于 URL



我今天遇到了一个烦人的问题。我正在做一个应用程序,可以查询自制的 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

最新更新