【问题标题】:HTTP GET request with many items in query string查询字符串中有许多项目的 HTTP GET 请求
【发布时间】:2017-12-18 15:41:23
【问题描述】:

我们使用查询字符串中的大量数据发出 HTTP GET 请求,表示要检索的集合的所有 id。

关于 url 中查询字符串的长度限制,快速谷歌搜索说:

RFC 3986 也声明没有限制,但表明主机名是 由于 DNS 限制(第 2.3.3 节),限制为 255 个字符。 Microsoft 声明 Internet Explorer 中 URL 的最大长度 是 2,083 个字符,路径中不超过 2,048 个字符 URL 的一部分。2009 年 5 月 1 日

如果我们不使用 IE,我是否应该担心可能超出查询字符串长度的限制? 我确定我在我的 Node.js Express 服务器上看到了超出限制,特别是当我在 GET 请求的查询字符串中包含一个表示图像的 base64 字符串时。

解决这个问题的好方法是什么?我们应该只使用 HTTP POST 请求吗?当然,我们不想为了避免这个问题而将 1 个 GET 请求分成 1000 个。

【问题讨论】:

  • 使用 Chrome Canary 后,我们很快就达到了 URL 长度的限制(绝对不是接近无限长度的任何东西)。
  • @CássioMazzochiMolin 我不是故意让你删除你的答案,我更想讨论一下。我的评论可能听起来措辞过于强硬。
  • @CodeCaster 这绝对是一个糟糕的设计:持久性将是一个问题,并且肯定会违反无状态约束。我删除以避免鼓励其他用户采用这种方法:)
  • @CássioMazzochiMolin 很高兴你同意。很遗憾看到在上述评论中链接的问题中多次提到相同的方法。真的很难做到很好,然后,你仍然在构建一个额外的依赖项,只是为了让你的搜索“安静”,不管这意味着什么。当然你可以问自己为什么首先需要一个参数权重为 2 KB 的搜索...
  • Web 基础设施通常允许缓存 GET 请求,但 HTTP 查询字符串的长度有限。它可以受到客户端(Firefox、IE、...)、服务器(Apache、IIS,...)或网络设备(应用防火墙,...)的限制。我想,在这种情况下,我们应该使用 POST。我阅读并获得了参考链接here

标签: http url web get query-string


【解决方案1】:

如果您打算保持 API 干净和 RESTful,您可以将您的请求分成两部分。第一个会将您的配置发送到服务器进行计算(POST);第二个将收集结果 (GET)。

除了克服浏览器、防火墙、路由器等 HTTP GET 的限制之外,这种方法还有很多优点。例如,您可以稍后引入部分结果轮询或取消长时间运行的计算的可能性。此外,您保持 URL 简短且用户可读。

已经在here描述了实现细节。

【讨论】:

    【解决方案2】:

    在 RESTful Web 服务中,GET 检索数据。 POST 请求在服务器上创建数据并且没有大小限制,但服务器通常有一个可以更改的默认限制。

    如果维护一个 RESTful 应用程序不适用于您的情况,那么您可以使用 POST。

    请务必注意,GET 请求可以被缓存,但 POST 请求不能,因此,如果您获得大量(相同)数据作为回报,您应该使用 GET。

    【讨论】:

      【解决方案3】:

      我会说,如果您有长度超过 2000GET 请求,那么它闻起来就像设计中有问题(我找不到通过GET in base64 而不是你提到的 POST)。 在那种情况下,我宁愿使用 POST;也在搜索关于 2048 个字符的限制似乎并不真正适用,请参阅firefox and Chrome,我不会依赖关于microsoft iehere a more detailed analysis 的过时信息。

      您也可以考虑为您的参数名称和值实现一个字符串缩短器,但我认为可读性更重要。看看this 的问题,关于如何在 javascript 中缩短参数。

      【讨论】:

        【解决方案4】:

        来自 IE applies to both GET and POST requests 的限制,所以首先,POST 请求不会完全解决您的问题。

        对于浏览器,there's no universal limit,每个浏览器都会实现不同的限制并带来不同的后果。

        此外,除了网络浏览器设置的限制外,服务器也可以有自己的限制,无论是默认的还是设置的(例如Apache's LimitRequestLine Directive)。

        此外,内存问题可能会成为处理数据时的障碍(例如PHP 可以为每个脚本设置内存限制),Apache 上的PHP 也有一个可配置的post_max_size 指令。

        一般来说,关于这个主题的共识是将您的 GET 请求长度限制为最多 2000 个字符,或者使用 POST 请求(尽管也有限制)。

        我的建议: 截断您的请求并发送几个请求,这些请求由服务器存储并在请求带有最终标志时进行处理,这可能是一种可能的解决方案。此外,还存在字符串压缩库来帮助您压缩和解压缩大型数据,例如,请参阅LZW compression,它适用于数十种编程语言。

        【讨论】:

          猜你喜欢
          • 2020-12-02
          • 1970-01-01
          • 1970-01-01
          • 2021-03-22
          • 2019-06-08
          • 1970-01-01
          • 2016-05-04
          相关资源
          最近更新 更多