我是否应该使用POST请求将检索请求发送给我的服务器以获取大量ID?

时间:2018-08-28 05:53:30

标签: 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个字符,因此exceed the character length limit of some browsers将发送其中100个ID作为GET请求的查询参数。由于URL限制,由于标准的GET请求不可行,因此我一直在考虑其他选择。

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

HTTP GET with request body

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

我知道POST请求应该为非幂等的请求保留,在我的情况下,我应该使用GET请求,因为查询是幂等的。我也知道REST纯粹是一个准则,并且由于该API仅由我使用,因此我可以做任何我想做的事。但是,我认为在做出任何决定之前,我会对此事发表第二意见。

那么,我该怎么办?

如果我确实使用POST请求,是否还有更好的选择尚未发现?

1 个答案:

答案 0 :(得分:1)

  

那么,我该怎么办?

第一步是检查HTTP方法注册表,该方法在RFC 7231

中定义
  

超出本规范范围的其他方法已标准化用于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 -从概念上讲,查询和结果是互为对偶的,因此可以认为是两个不同的{{3 }}是同一件事。您可以使用媒体类型进行管理-一种用于请求,另一种用于响应。

这会使您恢复幂等,但并不能确保您的安全。

我怀疑带有有效载荷的安全请求总是会成为问题; HTTP中的representations头文件没有提供让服务器宣布返回的表示形式取决于请求正文的部分能力(部分原因是GET不应该具有请求正文),因此它将中间组件很难理解请求主体的缓存含义。

  

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

不,我认为这根本无法解决您的问题。 X-HTTP-Method-Override(及其变体拼写)用于方法隧道,而不是方法重写规范。 X-HTTP-Method-Override: GET告诉服务器有效负载具有Vary,这使您像使用GET请求一样回到同一条船上。