如何发出HTTP PUT请求?

时间:2010-12-18 09:19:44

标签: http http-put

我知道HTTP PUT是一个幂等请求,根据定义(引自rfc

在特定URI上存储内容
The PUT method requests that the enclosed entity be stored under the supplied Request-URI.

但是'封闭实体'的定义是什么?我似乎无法发送表单数据(例如HTTP POST请求)。如何通过JSON / XML或其他序列化格式发送实体的表示?

简而言之,如何将HTTP PUT请求发送到特定URI的存储/更新信息呢?

5 个答案:

答案 0 :(得分:11)

在REST中你有:

GET - retrieve resource
POST - create new resource
PUT - update existing resource
DELETE - delete resource

因此PUT动词用于更新服务器上的现有资源。根据客户端的不同,有多种方式可以发送PUT请求。例如,使用jquery AJAX:

$.ajax({
    type: 'PUT',
    url: '/products/123',
    data: { name: 'new product name' }
});

答案 1 :(得分:11)

随附的实体是HTTP消息正文中包含的有效负载数据(在删除任何传输编码之后。)如果您在发送邮件正文时遇到问题,则可能是您忘记包含内容 - 长度标头 - 这是指示HTTP消息具有正文的两种方式之一。

PUT与POST相同,除了这个语义差异:使用POST,URI标识将处理实体的资源,例如servlet。使用PUT,URI标识实体本身,例如将使用实体主体的内容创建/替换的文件。

答案 2 :(得分:3)

因此,经常发出HTTP PUT请求以替换给定URI处的当前存储的资源。例如,有一本书存储在https://example.org/book/1,其中的数据可以用JSON表示,如下所示,

$ curl --request GET https://example.org/book/1
{
    "title": "Stackoverflow Compilation Book 1",
    "year": 2019
}

假设有人想要修复year字段,因为这本虚构的图书是去年(2018年)出版的,他/她必须通过HTTP PUT请求发送完整更新的图书信息。

$ curl --request PUT
      --header "Content-Type: application/json"
      --data '{"title": "Stackoverflow Compilation Book 1", "year": 2018}'

请注意year属性中的更改。

考虑到HTTP PUT请求本质上是替换操作,也可以将URI表示的书替换为其他内容。例如,

$ curl --request PUT
      --header "Content-Type: application/json"
      --data '{"title": "Some random book that nobody publishes", "year": 2019}'

附加数据可以是任何格式(通常也在请求标头Content-Type中指定,如上所示),只要它受支持,通常由Accept响应头报告(表示应用程序愿意处理的数据类型是什么类型。应用程序代码将处理进一步的验证,以确定提交的数据是否有效。

答案 3 :(得分:2)

您发送HTTP PUT,其中正文是您希望在请求的URL下存储的“封闭实体”。与POST非常相似,只是RFC中指定的语义不同。

答案 4 :(得分:1)

如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本。如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源。