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

包含正文是否需要HTTP PUT请求?,http,Http,我很难在标准中找到这方面的明确规范。我有一个HTTP客户端,在执行PUT请求时没有包含内容长度:0头,我没有指定主体,还有一个服务器被这些请求弄糊涂了,我想知道该怪哪个程序。根据HTTP/1.1标准中的以下部分,内容长度字段是必需的。如果没有内容,服务器上会放什么(动词意义上的)?将内容称为“封闭实体”,但没有内容的请求将没有封闭实体,因此没有任何内容可放在服务器上 当然,除非您不想在服务器上放置任何内容,否则您可能需要删除。如果HTTP请求具有内容长度或传输编码头(),则它们有一个正文。如果请

我很难在标准中找到这方面的明确规范。我有一个HTTP客户端,在执行PUT请求时没有包含
内容长度:0
头,我没有指定主体,还有一个服务器被这些请求弄糊涂了,我想知道该怪哪个程序。

根据HTTP/1.1标准中的以下部分,内容长度字段是必需的。

如果没有内容,服务器上会放什么(动词意义上的)?将内容称为“封闭实体”,但没有内容的请求将没有封闭实体,因此没有任何内容可放在服务器上


当然,除非您不想在服务器上放置任何内容,否则您可能需要删除。

如果HTTP请求具有内容长度或传输编码头(),则它们有一个正文。如果请求既没有正文,也没有正文,服务器应将其视为正文


也就是说,PUT请求没有正文是不寻常的,所以如果我设计的客户端真的想要发送一个空正文,我会传递内容长度:0。事实上,根据对POST和PUT方法定义()的阅读,人们可能会认为主体是必需的,但处理任何主体的合理方法都是假设主体长度为零。

没有回答这个问题,而是断言jaxrs如何允许我频繁使用无主体PUT:

无体推杆示例: 给用户一个额外的权限


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

IETF标准不需要正文,但如果没有正文,则内容长度应为0。使用适合您所做工作的方法。如果你要把它写进代码,给定

int x;
int f(){ return x; }
和一个名为
r
的远程变量

一个职位相当于

r=f();
r=x;
x=r;
看跌期权相当于

r=f();
r=x;
x=r;
get相当于

r=f();
r=x;
x=r;

那是一个不应该是我的问题!我得出了同样的结论。但严格地说,这与RFC背道而驰,在RFC中,虽然没有明确提及,但主体被称为“存在”。它可能会导致问题,但根据我的经验,所有现代web服务器/框架都可以工作。我的情况类似,我需要一个API来将现有资源与用户关联。我可以使用一个POST users/:userId/resources,在主体中使用resourceId。或者更确切地说,它适合放置users/:userid/resources/:resourceId。这里最大的区别是第一个API应该是非幂等的,所以我可以将同一个资源与一个用户关联两次。PUT调用应该重置以前的关联这是我读过的PUT vs POST的最清晰的例子,不过如果请求有一个内容长度头,那么它就有一个正文。它可能是一个空的身体,但仍然是一个身体。与没有内容长度头的请求相反,该请求根本没有正文,甚至没有空正文。所以是的,严格来说,一个PUT请求必须有一个主体。总是这样。而且你的帖子类比让我完全困惑。如果我继续你的类比,它应该更像服务器有一个
intf(int*resource,intbody)f(&r,x)
--服务器认为合适的,可以对
r
执行,也可以不执行。但它也可以退货,所以。。。可能更像
y=f(&r,x)
。您的输入可能是URL编码的,而不是bodyPUT empty,这只是声明具有给定标识的资源必须存在于服务器上,尽管它除了标识本身之外没有任何内容。这与DELETE的语义完全不同。假设您想放置一个资源,但接受所有服务器端默认值。这将是JSON中的
Content Length:0
{}
作为正文?因此,您的计算机上没有一个空文件,是吗?正文中是否需要“封闭的实体”呢?如果我可以问的话,您为什么要编辑2009年的问题?@zmuci以获得更好的格式?HTTP状态码200(“确定”)、201(“已创建”)和204(“无内容”)意味着,
PUT
请求基本上是为了在服务器上创建或更新文件。文件为空没有什么不合法的,不是吗?新链接:@bdonlan你说有空正文的PUT是不寻常的,但是如果我想启用或禁用用户,我的请求中不需要正文,实际上PUT请求可以d是“/users/{id}/enable”或“/users/{id}/disable”。@ViniciusdeAlmeida如果您试图遵守REST标准,这些资源将不合适。
disable
enable
是动词。在这种情况下,我可能更喜欢在
/users/{id}
端点上使用
PATCH