PUT和POST请求是否需要/预期有请求正文?

时间:2011-09-06 17:45:12

标签: http rest post httpwebrequest put

我正在写一个RESTful api,而我正在考虑用户创建密钥的过程。我有以下几种可能性:

  • 获取/new/<keyname>的请求 - 虽然这很容易,但我认为我不会使用它,因为我听说GET用于检索和/或列出信息;
  • /<keyname>的POST请求 - 这在我看来简单易行,但不会在请求正文中传递任何数据。我可以这样做吗?这有点奇怪吗?
  • /keys发送请求正文"keyname=SomeKey"的POST请求 - 这是正确的方法吗?

我查看了this API from joyent,在他们所有的PUT和POST请求中,他们在请求正文中传递了一些数据。这是预期的吗?在PUT和POST请求中不要求请求主体是否真的错了?

6 个答案:

答案 0 :(得分:14)

我在Http-WG问了这个问题。这是我得到的最精确的答案http://lists.w3.org/Archives/Public/ietf-http-wg/2010JulSep/0276.html

总之,POST不需要正文。我希望同样的理由可以应用于PUT。

答案 1 :(得分:6)

RFC2616 is the base RFC for HTTP 1.1

在最常见的形式中,HTTP消息是这样的(注意可选主体):

generic-message = start-line
                  *(message-header CRLF)
                  CRLF
                  [ message-body ]
start-line      = Request-Line | Status-Line

进一步阅读:

9.5 POST

   The POST method is used to request that the origin server accept the
   entity enclosed in the request as a new subordinate of the resource
   identified by the Request-URI in the Request-Line. ...

9.6 PUT

   The PUT method requests that the enclosed entity be stored under the
   supplied Request-URI. ...

   The fundamental difference between the POST and PUT requests is
   reflected in the different meaning of the Request-URI. The URI in a
   POST request identifies the resource that will handle the enclosed
   entity. That resource might be a data-accepting process, a gateway to
   some other protocol, or a separate entity that accepts annotations.
   In contrast, the URI in a PUT request identifies the entity enclosed
   with the request -- the user agent knows what URI is intended and the
   server MUST NOT attempt to apply the request to some other resource.

POST和PUT都包含请求中包含的 实体

根据我的阅读,我相信POST和PUT都需要一个正文(我知道的非规范性描述)。

在REST环境中, POST 是创建的, PUT 是更新。我可以想象创建一个空对象(可能是未来信息的占位符),但我没想到会有太多的空更新。

答案 2 :(得分:0)

不是必需的。您可以发送不带正文的POST / PUT请求,而使用查询字符串参数。但是请注意,如果您的参数包含不是HTTP有效的字符,则必须对其进行编码。

例如,如果需要将“ hello world”发布到终点,则必须使它看起来像这样:http://api.com?param=hello%20world

答案 3 :(得分:-1)

可能最好的方法是第三种选择:使用/keys发送到keyname=SomeKey

原因如下:您可能希望在API中添加其他功能,例如create_new_user。然后很难区分用户尝试发布名为create_new_user的密钥和尝试使用create_new_user功能的用户之间的区别。

你说你不应该使用GET来执行此操作作为GET操作"SHOULD NOT have the significance of taking an action other than retrieval." (RFC 2616)

答案 4 :(得分:-1)

在一行中回答您的问题。是的,预计身体中有身体/内容,但不是必需的(强制性的)。

答案 5 :(得分:-1)

根据okHttp3(用于android的HTTP库):以下方法需要一个正文:POST,PUT,PATCH,PROPPATCH(WebDAV)和REPORT(source)。如果您尝试使用给定方法在没有正文的情况下执行请求,它甚至会崩溃。