rest - 我应该使用 POST 请求向我的服务器发送大量 ID 的检索请求吗?

标签 rest web-services http post api-design

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

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 请求的主体发送 ID 数组。这是Dropbox的方法似乎已用于其面向公众的 API。

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

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

最佳答案

So, what should I do in my situation?

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

Additional methods, outside the scope of this specification, have been standardized for use in HTTP. All such methods ought to be registered within the "Hypertext Transfer Protocol (HTTP) Method Registry" maintained by IANA

注册表当前位于:https://www.iana.org/assignments/http-methods/http-methods.xhtml

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

在您的情况下,您正在尝试通过消息正文传达查询。通常,查询不仅仅是 idempotent还有safe .

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

SEARCH is a safe method; it does not have any significance other than executing a query and returning a query result

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

但也许其他东西更合适。

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

就其本身而言,这并不是您想要的单一调用和响应。它所做的是让您思考如何返回查询结果资源的表示。特别是,您可以使用 Content-Location向中介传达响应主体实际上是资源的表示。

I know that POST requests should be reserved for requests that are not idempotent

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

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

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

我怀疑带有负载的安全请求总是会成为问题; Vary HTTP 中的 header 没有允许服务器宣布返回的表示取决于请求主体的功能(部分原因是 GET 不应该有请求主体),因此对于中间组件来说会很困难了解请求主体的缓存含义。

I did come across another alternative method from another SO thread, which was to tunnel a GET request using POST/PUT method by adding the X-HTTP-Method-Override request header. Do you think its a legitimate solution to my question?

不,我认为它根本无法解决您的问题。 X-HTTP-Method-Override(及其变体拼写)用于方法隧道,而不是 method-override-the-specification-ing。 X-HTTP-Method-Override: GET 告诉服务器负载有 no defined semantics ,这让您回到使用 GET 请求的同一条船上。

关于rest - 我应该使用 POST 请求向我的服务器发送大量 ID 的检索请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52050997/

相关文章:

java - 未指定 @DefaultValue 时 @QueryParam 的默认值是什么?

c# - CLR 函数不会返回超过 4000 个字符

java - CONNECT 请求未调用 Servlet service() 方法

php - 如何在没有html的情况下仅使用url在php中上传文件?

java - 通过 wsdl 文件生成 Web 服务功能

http - 使用文件服务器为我的单个 html 页面提供服务

REST API 命名约定 : referencing unique resources with nested paths

javascript - React 渲染 FusionChart 使用 API Rest

java - 使用高级 rest chrome 打印 json 对象时意外的 token L

C#:进行 SOAP 调用时如何使用 HTTP 身份验证?