代码之家  ›  专栏  ›  技术社区  ›  Gaëtan Boyals

将筛选器“小于或等于”应用于URL

  •  0
  • Gaëtan Boyals  · 技术社区  · 6 年前

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

    有趣的是如果我移除 < 以及 > 它就像一个魅力。 我试着在 official doc for URL object 但它似乎不需要特殊的编码。?

    我还查看了上述官方文件中提到的RFC1808,这些特殊字符标记为 punctuation 所以我相信把它们放到一个URL中是可以的。

    问题来自哪里?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Dávid Pásztor    6 年前

    您需要对该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