21

我知道 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 上存储/更新信息?

4

5 回答 5

14

在 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' }
});
于 2010-12-18T09:22:42.800 回答
12

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

PUT 与 POST 相同,只是语义上有所不同:使用 POST,URI 标识将处理实体的资源,例如 servlet。使用 PUT,URI 标识实体本身,例如将使用实体主体的内容创建/替换的文件。

于 2010-12-18T15:32:20.153 回答
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
}

假设有人想要修复该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响应头上报(表示应用程序愿意处理什么样的数据类型) . 应用程序代码将处理进一步的验证以确定提交的数据是否有效。

于 2010-12-18T09:37:07.873 回答
2

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

于 2010-12-18T09:23:41.673 回答
1

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

于 2016-11-24T10:01:51.937 回答