【问题标题】:Should I use a POST request to send a retrieval request to my server for a large array of ids?我应该使用 POST 请求向我的服务器发送检索请求以获取大量 id 吗?
【发布时间】:2019-02-02 16:21:33
【问题描述】:

我阅读了以下帖子;但是,我仍然没有找到我的问题的决定性答案。

When do you use POST and when do you use GET?

How should I choose between GET and POST methods in HTML forms?

So why should we use POST instead of GET for posting data? [duplicate]

我想向我的服务器发出一个 HTTP 请求,以根据我将传递给服务器的一组 id 检索一些数据。由于每个 id 的长度为 23 个字符,因此发送 100 个这些 id 作为 GET 请求的查询参数将exceed the character length limit of some browsers。由于 URL 限制,标准 GET 请求不可行,因此我一直在考虑其他选择。

选项1:使用HTTP GET请求的请求体(根据以下SO线程不建议)

HTTP GET with request body

选项 2: 使用 HTTP POST 请求的正文发送 Ids 数组。这是Dropbox 似乎已用于其面向公众的 API 的方法。

我知道 POST 请求应该保留给非幂等的请求,在我的情况下,我应该使用 GET 请求,因为查询是幂等的。我也知道 REST 纯粹是一个指南,因为这个 API 只能由我使用,所以我可以做任何我喜欢的事情;但是,我认为在做出任何决定之前,我会就此事获得第二意见。

那么,在我的情况下我应该怎么做呢?我还没有发现更好的替代方案吗?如果我使用 POST 请求,我应该考虑什么?

【问题讨论】:

标签: rest web-services http post api-design


【解决方案1】:

那么,我该怎么办呢?

第一步是查看RFC 7231中定义的HTTP方法注册表

本规范范围之外的其他方法已被标准化以在 HTTP 中使用。所有此类方法都应在 IANA 维护的“超文本传输​​协议 (HTTP) 方法注册表”中注册

注册表目前在这里:https://www.iana.org/assignments/http-methods/http-methods.xhtml

因此您可以查看已经标准化的方法,看看它们是否有匹配的语义。

在您的情况下,您正在尝试将查询与消息正文进行通信。通常,查询不仅仅是idempotent,还有safe

快速浏览一下注册表可能会让您考虑SEARCH

SEARCH 是一种安全的方法;它除了执行查询并返回查询结果之外没有任何意义

这看起来是个不错的选择,除非您仔细阅读规范并注意constraints relating the message body。简而言之,WebDAV 可能不是您想要的。

但也许其他东西更合适。

第二种选择是将您的搜索习语视为一种协议。您将 ID 发布(或 PUT 或 PATCH)到服务器以创建资源,然后在需要结果时获取该资源的表示。

就其本身而言,这并不是您想要的单一呼叫和响应。它所做的是让您思考如何返回查询结果资源的表示。特别是,您可以使用Content-Location 与中介沟通,即响应正文实际上是资源的表示。

我知道 POST 请求应该保留给非幂等的请求

这不是完全正确的。当发出与另一种方法的语义一致的请求时,我们更喜欢使用另一种方法,以便中间组件可以利用语义:可以尝试幂等请求,可以预取安全请求,等等。因为 POST 不提供这些保证,所以客户无法利用它们即使他们碰巧申请了

根据您需要如何管理源服务器 URI 命名空间,您可以使用 PUT -- 从概念上讲,查询和结果是相互对偶的,因此可以认为是两个不同的 representations一样。您可以使用媒体类型进行管理 - 一种用于请求,另一种用于响应。

这会让你恢复幂等性,但它不会让你安全。

我怀疑带有有效负载的安全请求总是会成为问题; HTTP 中的 Vary 标头无法让服务器宣布返回的表示取决于请求正文(部分原因是 GET 不应该具有请求正文),所以这将是困难的让中间组件了解请求正文的缓存含义。

我确实从另一个 SO 线程中遇到了另一种替代方法,即使用 POST/PUT 方法通过添加 X-HTTP-Method-Override 请求标头来隧道化 GET 请求。您认为这是对我的问题的合法解决方案吗?

不,我认为它根本不能解决您的问题。 X-HTTP-Method-Override(及其变体拼写)用于方法隧道,而不是方法覆盖规范。 X-HTTP-Method-Override: GET 告诉服务器有效载荷有no defined semantics,这让您回到与使用 GET 请求相同的船上。

【讨论】:

  • 像这样的答案可以帮助 SO 社区中的每个人学到很多东西,所以谢谢。我确实从另一个 SO 线程中遇到了另一种替代方法,即使用 POST/PUT 方法通过添加 X-HTTP-Method-Override 请求标头来隧道化 GET 请求。您认为这是对我的问题的合法解决方案吗?从表面上看,这似乎有点老套,但我真的不够了解,无法判断如此热衷于了解您的想法。
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2016-05-15
  • 1970-01-01
  • 2020-08-17
  • 2019-03-16
  • 1970-01-01
相关资源
最近更新 更多