是否需要HTTP PUT请求才能包含正文?

Mar*_*ijn 76 http

我很难在标准中找到明确的规范.我有一个HTTP客户端Content-Length: 0在执行PUT请求时没有包含头文件,我没有指定正文,服务器也被这些请求搞糊涂了,我想知道应该指责哪个程序.

bdo*_*lan 68

如果HTTP请求具有Content-Length或Transfer-Encoding标头(RFC 2616 4.3),则它们具有正文.如果请求都没有,则它没有正文,您的服务器应该这样处理它.

那说PUT请求没有身体是不寻常的,所以如果我设计一个真正想要发送空体的客户端,我会传递Content-Length:0.的确,取决于一个人对POST的阅读和PUT方法定义(RFC 2616 9.5,9.6)有人可能会认为身体被暗示是必需的 - 但是处理没有身体的合理方法是假设一个零长度的身体.

  • @bdonlan 你说带有空主体的 PUT 是不寻常的,但如果我想启用或禁用用户,我的请求将不需要主体,实际上 PUT 请求可能是“/users/{id}/enable”或“/users/{id}/disable”。 (7认同)

Ble*_*eek 37

没有回答这个问题,但断言jaxrs如何让我经常使用无体PUT:

无体放置示例:为用户提供其他权限.

PUT/admin/users/{username}/permission/{permission}

  • 正是我的问题!我得出了同样的结论.但严格来说,这违反了RFC,虽然没有明确提到,但是身体被称为存在.它可能会导致问题,但根据我的经验,所有现代Web服务器/框架都可以工作. (2认同)

小智 5

IETF标准不要求使用正文,但是如果没有正文,则content-length应该为0。使用适合您正在执行的方法。如果您将其放入代码中,则给出

int x;
int f(){ return x; }
Run Code Online (Sandbox Code Playgroud)

和一个名为的远程变量r

帖子等同于

r=f();
Run Code Online (Sandbox Code Playgroud)

看跌期权等同于

r=x;
Run Code Online (Sandbox Code Playgroud)

得到等于

x=r;
Run Code Online (Sandbox Code Playgroud)

  • 另外,你的 POST 类比让我完全困惑。如果我尝试继续其余的类比,它应该更像是服务器有一个 `int f(int* resources, int body);`,然后 POST 会调用 `f(&r, x);` --这可能会或不会对“r”执行服务器认为合适的任何操作。但它也可以返回东西,所以......也许更像`y = f(&r, x);`。 (2认同)