我正在写一个RESTful api,而我正在考虑用户创建密钥的过程。我有以下几种可能性:
/new/<keyname>
的请求 - 虽然这很容易,但我认为我不会使用它,因为我听说GET用于检索和/或列出信息; /<keyname>
的POST请求 - 这在我看来简单易行,但不会在请求正文中传递任何数据。我可以这样做吗?这有点奇怪吗?/keys
发送请求正文"keyname=SomeKey"
的POST请求 - 这是正确的方法吗?我查看了this API from joyent,在他们所有的PUT和POST请求中,他们在请求正文中传递了一些数据。这是预期的吗?在PUT和POST请求中不要求请求主体是否真的错了?
答案 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)。如果您尝试使用给定方法在没有正文的情况下执行请求,它甚至会崩溃。