30

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

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

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

4

6 回答 6

26

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

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

于 2011-09-06T21:57:37.010 回答
7

RFC2616 是 HTTP 1.1 的基础 RFC

在最一般的形式中,HTTP 消息是这样的(注意可选正文):

通用消息 = 起始行
                  *(消息头 CRLF)
                  CRLF
                  [ 邮件正文 ]
start-line = 请求行 | 状态行

进一步阅读给出了这一点:

9.5 发布

   POST 方法用于请求源服务器接受
   包含在请求中的实体作为资源的新下属
   由 Request-Line 中的 Request-URI 标识。...

9.6 放

   PUT 方法请求将封闭的实体存储在
   提供的请求 URI。...

   POST 和 PUT 请求之间的根本区别是
   体现在Request-URI的不同含义上。URI 中的
   POST 请求标识将处理封闭的资源
   实体。该资源可能是一个数据接受过程,一个通往
   一些其他协议,或接受注释的单独实体。
   相反,PUT 请求中的 URI 标识包含的实体
   与请求 - 用户代理知道 URI 的意图和
   服务器不得尝试将请求应用于其他资源。

POST 和 PUT 都包含请求中包含的短语 entity

根据我的阅读,我认为 POST 和 PUT 都需要一个主体(我知道,这是一个非规范性描述)。

在 REST 的上下文中,POST是创建,PUT是更新。我可以想象创建一个空对象(可能是未来信息的占位符),但我不认为空更新的用途很多。

于 2011-09-06T18:03:12.317 回答
1

这不是必需的。您可以发送不带正文的 POST/PUT 请求,而是使用查询字符串参数。但要小心,如果您的参数包含非 HTTP 有效的字符,您将不得不对它们进行编码。

例如,如果您需要 POST 'hello world' 到终点,您必须使其看起来像这样:http ://api.com?param=hello%20world

于 2019-07-09T02:59:23.187 回答
-1

最好的方法可能是您的第三个选项: POST 到/keyswith keyname=SomeKey

原因如下:您可能希望向 API 添加另一个函数,例如create_new_user. 这样就很难区分用户尝试 POST 调用的键create_new_user和用户尝试使用该create_new_user功能。

您说您不应该使用 GET 来执行此操作是正确的,因为 GET 操作“不应该具有采取除检索之外的操作的意义”。(RFC 2616)

于 2011-09-06T17:50:24.937 回答
-1

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

于 2015-06-01T20:56:49.507 回答
-1

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

于 2017-03-10T14:45:20.933 回答