如何发出HTTP PUT请求?

Jef*_*y04 16 http http-put

我知道HTTP PUT是一个幂等请求,根据定义(引自rfc)将某些内容存储在特定的URI中

The PUT method requests that the enclosed entity be stored under the supplied Request-URI.
Run Code Online (Sandbox Code Playgroud)

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

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

Dar*_*rov 11

在REST中你有:

GET - retrieve resource
POST - create new resource
PUT - update existing resource
DELETE - delete resource
Run Code Online (Sandbox Code Playgroud)

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

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


Cia*_*ing 11

随附的实体是HTTP消息体中包含的有效负载数据(在删除任何传输编码之后.)如果您在发送消息体时遇到问题,那么可能是您忘记包含Content-Length标头 - 这是指示HTTP消息具有正文的两种方法之一.

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


Jef*_*y04 5

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

$ curl --request GET https://example.org/book/1
{
    "title": "Stackoverflow Compilation Book 1",
    "year": 2019
}
Run Code Online (Sandbox Code Playgroud)

假设有人想要修复该year领域,因为虚构的书是去年(2018 年)出版的,他/她必须通过 HTTP PUT 请求发送 COMPLETE 更新的书籍信息。

$ curl --request PUT
      --header "Content-Type: application/json"
      --data '{"title": "Stackoverflow Compilation Book 1", "year": 2018}'
Run Code Online (Sandbox Code Playgroud)

注意year属性的变化。

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

$ curl --request PUT
      --header "Content-Type: application/json"
      --data '{"title": "Some random book that nobody publishes", "year": 2019}'
Run Code Online (Sandbox Code Playgroud)

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