HTTP PUT请求通常如何发布?

问题描述:

我知道HTTP PUT被存储在一个特定的URI东西幂等请求,根据定义(从rfc报价)HTTP PUT请求通常如何发布?

The PUT method requests that the enclosed entity be stored under the supplied Request-URI. 

但什么是“封闭的实体”的定义是什么?我似乎不可能发送表单数据(如HTTP POST请求)。通过JSON/XML或其他序列化格式发送实体的表示怎么样?

总之,如何发送HTTP PUT请求来存储/更新特定URI的信息呢?

+0

http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services – W55tKQbuRu28Q4xv 2010-12-18 09:23:22

封闭的实体是HTTP消息体中包含的有效载荷数据(在删除任何传输编码之后)。如果您无法发送消息正文,那么可能是因为忘记了包含内容-Length头 - 这是表明HTTP消息具有主体的两种方式之一。

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

在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' } 
}); 
+0

但是,如何发出HTTP PUT请求?是以正确的方式发布在以下问题中的一个? http://*.com/questions/2719610/should-i-allow-sending-complete-structures-when-using-put-for-updates-in-a-rest-a – Jeffrey04 2010-12-18 09:24:52

+1

@ Jeffrey04,这取决于什么服务器期望。在这个例子中,你展示的是XML。但你也可以使用其他格式。我建议你观看[关于使用REST for SOA的视频](http://www.infoq.com/presentations/Using-REST-for-SOA)。 – 2010-12-18 09:26:09

+0

http://jcalcote.wordpress.com/2008/10/16/put-or-post-the-rest-of-the-story/很好地解释了POST和PUT的不同用途。 IT使用依赖,而不是行动。 – 2014-06-27 15:34:07

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

+1

你介意加入一个例子吗?谢谢 – Jeffrey04 2010-12-18 09:30:08

+0

也许您对此感到困惑:您实际上正在发送HTTP POST请求 - 您的Web浏览器不支持PUT。您在表单数据中传入type = PUT,以便您的Web应用程序(即Rails)知道该怎么做。 – 2010-12-18 16:11:04

+0

@Paul我实际上是通过php(zend_framework)开发一个宁静的API网站,但我不知道PUT是如何实际完成的(因此问题),看起来不像表单输入应该/可以使用。我的webserver和php脚本能够处理PUT请求。 – Jeffrey04 2010-12-18 18:39:38

不知道这是正确的答案,但我可能只是尝试

发出HTTP GET到http://example.org/api/foo/1后想,我得到这个

GET http://example.org/api/foo/1 
Accept: application/json 

响应:

{ 
    "foo": "bar" 
} 

然后发出放入请求

PUT http://example.org/api/foo/1 
{ 
    "foo": "baz" 
} 

只要端点上托管的应用程序能够理解我发送的格式。

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