【问题标题】:Rest POST VS GET if payload is huge如果有效负载很大,则休息 POST VS GET
【发布时间】:2015-08-01 05:07:30
【问题描述】:

我理解 GET 和 POST 的定义如下。

GET:列出集合的成员,并附上他们的成员 URI,以便进一步导航。例如,列出所有待售汽车。

POST:在集合中创建一个新条目,其中 ID 由集合自动分配。创建的 ID 通常包含在此操作返回的数据中。

在这种情况下,我的 API 使用 JSON 消息在具有巨大请求负载的服务器中搜索一些细节,我应该使用哪个动词?

还有谁能告诉我可以在查询字符串中传递的字符的长度。

【问题讨论】:

  • 这取决于您使用的网络服务器。我只会使用 POST。
  • 您的用例中“巨大”的定义是什么?
  • @tigeronk2 我的意思是请求中有很多搜索条件。
  • 我的意思是请您根据搜索条件中的字符数进行量化。
  • 这样一个“搜索”资源的 URL 是什么?请edit您的问题,并包含使用 GET 的此类资源的示例。

标签: rest


【解决方案1】:

GET 和 POST 请求的主要区别在于,前者将整个请求编码为 URL 本身的一部分,而在后者中,参数在标头之后发送。此外,在 GET 请求中,不同的浏览器会对 URL 的大小施加不同的限制。大多数现代浏览器至少允许 200KB,但 Internet Explorer 似乎将 URL 大小限制为 2KB。

话虽如此,如果您怀疑您将传递大量可能超过接收 Web 服务器对 GET 请求施加的限制的参数,您应该改用 POST。

Here is a site 调查了大多数现代浏览器的 GET 行为,值得一读。

【讨论】:

  • HTTP 是基于行的,所以你不能真正谈论数据包。 GET 和 POST 之间的唯一区别是 POST 数据位于标头之后。
  • 使用 POST 有效 GET 搜索结果不是 RESTful。
  • 出于教育目的,如果参数不适合 GET,您建议如何发送读取信息的请求?
  • @Time 使用POST /queries 创建一个新的“查询”实例。响应将是带有位置标头的201 Created。然后GET /queris/id-of-query-as-assigned-by-the-server 将用于检索计算结果。那将是 RESTful,因为它处理资源。用 在响应正文中的结果响应 POST 是 RPC,而不是 REST。
  • 呃,是的,这还需要您设计该查询的持久性,不用了,谢谢
【解决方案2】:

聚会迟到了,但对于任何正在寻找解决方案的人来说,这可能会有所帮助。

我刚刚想出了两种不同的策略来解决这个问题。我将创建概念证明 API 并测试哪个更适合我。以下是我目前正在考虑的解决方案:

1. X-HTTP-Method-Override:

基本上我们会使用 POST/PUT 方法对 GET 请求进行隧道化,并添加 X-HTTP-Method-Override 请求标头,以便服务器将请求路由到 GET 调用。实施简单,一趟就能奏效。

2。分而治之:

将请求分成两个单独的请求。发送带有所有有效负载的 POST/PUT 请求,服务器将创建必要的响应并将其与密钥/ID 一起存储在缓存/数据库中以访问数据。然后服务器将响应“位置”标头或可以访问存储响应的密钥/ID。

现在使用服务器在之前的 POST 请求中给出的键/位置发送 GET 请求。实现起来有点复杂,需要两个请求,还需要单独的策略来清理缓存的响应。

【讨论】:

  • 很高兴知道它有一个行话的名字。 “分而治之”。这比我的回答更好。不过不喜欢选项 1。
  • 另一种可能性是 POST 只会将请求数据保存为资源(但不会查找结果)并返回(该资源的)id。然后 GET 将传递该 ID。实现将 1) 根据保存的请求数据查询/获取结果 2) 擦除请求数据,3) 以结果响应
  • 2 尺度相当不错。谷歌的反向图像搜索就像“分而治之”。上传图片发生在 POST /upload 上,然后发送 302 和实际结果的 URL。
【解决方案3】:

如果这将是您的 API 的典型情况,那么 RESTful 方法可能是将查询数据 POST 到缓冲区端点,该端点返回一个 URI,您可以从中获取结果。

谁知道也许这些缓存将减少发送“巨大” 块数据的需要。

【讨论】:

    【解决方案4】:

    你可以通过将一些数据传递到服务器来使用两者从服务器获取结果

    如果有一个或两个参数,例如 Id

    这里只使用了一个参数。但是可以使用3到4个参数这是我在angularjs中使用的方式

    首选:获取

    Example : $http.get('/getEmployeeDataById?id=22');
    

    万一是大 Json 对象

    首选:发帖

    Example : var dataObj = 
              {
                    name : $scope.name,
    
                    age : $scope.age,
    
                    headoffice : $scope.headoffice
    
              };    
    
    var res = $http.post('/getEmployeesList', dataObj);
    

    And For Size Of Characters That Can Be Passed In Query String Here Is Already Answered

    【讨论】:

    • 技术上这是可能的。但它不是 REST。再次发布这样的 POST 的资源是什么?它显然不是一个集合资源。你的答案闻起来像 RPC over HTTP。
    • 可能会受到纯粹主义者的抨击,但这并不是一个可怕的规则。有时传递有效负载来获取所需对象更有意义 - 就个人而言,我更喜欢规范是否允许通过 GET 请求发送有效负载,但使用 POST“不遵循规范”有时是有意义的。跨度>
    【解决方案5】:

    如果您要从服务器获取数据,请使用 GET。如果您想发布内容,请使用 POST。有效载荷大小无关紧要。如果您想使用较小的有效负载,您可以实现分页。

    【讨论】:

    • 有效载荷大小无关” - 理论上。
    • 我们所描述的有效载荷并非无关紧要。结果的分页总是有意义的,但对于查询来说通常不可行。
    • 所有你想在 GET 请求中传递的“东西”都被编码成一个 URL。由于 URL 仅限于 x 个字符,因此大小是相关的。问题是当 GET 的大小可能超过 url 限制时你会怎么做
    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多