我知道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的存储/更新信息呢?
答案 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创建资源。