【发布时间】:2009-08-05 13:47:52
【问题描述】:
我在标准中找不到明确的规范。我有一个 HTTP 客户端,它在执行未指定正文的 PUT 请求时不包含 Content-Length: 0 标头,并且服务器被此类请求弄糊涂了,我想知道我应该责怪哪个程序。
【问题讨论】:
-
如果我可以问,您为什么要编辑 2009 年的问题?
-
@zmuci 想要更好的格式?
标签: http
我在标准中找不到明确的规范。我有一个 HTTP 客户端,它在执行未指定正文的 PUT 请求时不包含 Content-Length: 0 标头,并且服务器被此类请求弄糊涂了,我想知道我应该责怪哪个程序。
【问题讨论】:
标签: http
如果 HTTP 请求具有 Content-Length 或 Transfer-Encoding 标头 (RFC 2616 4.3),则它们具有正文。如果请求两者都没有,则它没有正文,您的服务器应该这样对待它。
也就是说,PUT 请求没有正文是不寻常的,因此,如果我正在设计一个真正想要发送空正文的客户端,我会传递 Content-Length: 0。事实上,这取决于一个人的阅读在 POST 和 PUT 方法定义 (RFC 2616 9.5, 9.6) 中,有人可能会争辩说,暗示正文是必需的 - 但处理任何正文的合理方法是假定正文长度为零。
【讨论】:
PUT 请求基本上用于在服务器。而且文件为空并没有什么非法,不是吗?
disable 和 enable 是动词。在这种情况下,我可能更愿意在/users/{id} 端点上使用PATCH。
不回答问题,但断言 jaxrs 如何让我经常使用无体 PUT:
无主体放置示例: 给用户额外的权限。
PUT /admin/users/{username}/permission/{permission}
【讨论】:
IETF 标准不要求正文,但如果没有正文,则内容长度应为 0。使用适合您正在做的事情的方法。如果你要把它放到代码中,给定
int x;
int f(){ return x; }
还有一个名为r的远程变量。
一个帖子相当于
r=f();
一个put等价于
r=x;
get 等价于
x=r;
【讨论】:
int f(int* resource, int body);,然后 POST 将调用f(&r, x);——无论服务器认为合适,这可能对r 执行或不执行.但它也可以返回东西,所以......也许更像y = f(&r, x);。
如果没有内容,什么是 PUT(动词意义上的)到服务器上? spec 将内容称为“封闭实体”,但没有内容的请求将没有封闭实体,因此没有任何东西可以放在服务器上。
当然,除非您不想在服务器上放置任何内容,在这种情况下,您可能需要 DELETE。
【讨论】:
Content-Length: 0 或 { } 作为正文?
根据 HTTP/1.1 标准 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13 中的以下部分,内容长度字段是必需的
【讨论】: