如何向 GET 请求发送巨大的参数列表
Posted
技术标签:
【中文标题】如何向 GET 请求发送巨大的参数列表【英文标题】:How to send a huge parameter list to a GET request 【发布时间】:2018-09-28 08:17:45 【问题描述】:我的服务器中有一个 REST API,其中 List 操作(应该使用 GET 方法实现)从客户端接收多个参数:
当前页面 行数 用于执行快速搜索的文本 为搜索定义复杂过滤器的对象(“字段操作值”形式的规则集)由于过滤搜索的对象很复杂,我需要将列表定义为 POST,我认为这不是一个好主意,因为 REST 将列表操作定义为 GET。
我的问题很简单:有什么方法可以使用 GET 方法解决这个问题,避免使用带有参数的巨大 URL 来调用它?
【问题讨论】:
如何根据 URL 参数大小定义 huge,这有点令人担忧。看看***.com/a/417184/3126973。因此,我认为您的 complex object 不能作为 GET 参数通过 URL 传递。 看看这个帖子link。 TLDR:虽然您可以发送带有 GET 请求的正文,但不建议这样做,也没有在规范中定义。 如果我是你,我会在请求正文中发送该对象,但我会选择另一种幂等 HTTP 方法以尊重 GET 方法的幂等性质(PUT 怎么样?) . 【参考方案1】:感谢您的回答。似乎这个问题真的很令人担忧,因为没有明确的有效答案。由开发者决定如何处理。
REST 说你应该使用 GET 方法来列出,但是大的 URI 非常难看。现在有什么问题吗?似乎没有问题,因为大多数浏览器都支持非常大的URI(Internet Explorer,回家,你不要玩这个游戏) 您也可以使用 PUT/POST 方法进行列表,但它似乎不符合 REST 原则 你可以使用GET方法来传递简单的参数,并在body中附加复杂的参数,但它没有完成HTTP原理看来最好的方法是第一种:使用 GET 并构建巨大的 URI。
【讨论】:
【参考方案2】:您可以将您的对象转换为 json,然后对 json 文本字符串进行 url 编码,以便将其放入单个参数中。
要使您的 url 编码的 json 字符串更短,您可以在将对象转换为 json 文本字符串之前从对象中删除所有默认值。
get 请求中的长查询字符串很常见,因此无需担心这些。 a limit 表示查询字符串可能会变成多长。
【讨论】:
链接的答案说明存在限制 @WalleCyril 浏览器实现创建的限制可能是个问题,但这仅取决于 Marc 是否可能达到这些限制【参考方案3】:我遇到了类似的问题。我不得不发送一个巨大的列表,但我仍然必须使用 GET。我最终用一种编码算法对字符串进行了编码并像这样发送它。我在后端解码列表。我还有一个参数,它指定调用是否已编码,因此端点可以同时使用编码和未编码。
您也可以将此方法用于多个参数。您可以发送参数列表,如 param1:value1,param2:value2 编码并在后端对其进行解码。
我研究的另一种方法是使用 Base 62 转换数字。
【讨论】:
我终于用 POST 请求了;)我选择它是因为我觉得它更好...以上是关于如何向 GET 请求发送巨大的参数列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Dio 或 http 在 Flutter 中通过 GET 请求发送参数