什么是使用HTTP GET,PUT,DELETE,POST,HEAD的实际的好处? 为什么不专注于自己的行为利益(安全和幂等),忘了自己的名字,并使用GET,PUT或POST取决于其行为,我们想要的吗?
为什么我们不应该只使用GET,PUT和POST(拖放HEAD,DELETE)?
什么是使用HTTP GET,PUT,DELETE,POST,HEAD的实际的好处? 为什么不专注于自己的行为利益(安全和幂等),忘了自己的名字,并使用GET,PUT或POST取决于其行为,我们想要的吗?
为什么我们不应该只使用GET,PUT和POST(拖放HEAD,DELETE)?
在[REST] [1]的方法使用POST,GET,PUT和DELETE来实现对网络资源的CRUD规则。 这是揭露对象在网络上请求一个简单而整洁的方式。 它的Web服务,而开销。
只是为了澄清语义差异。 每个操作是相当不同。 问题的关键是要有有明确的,不同的含义不错的HTTP方法。
POST创建新的对象。 该URI没有关键; 它接受消息主体定义对象。 SQL插入。 [ 编辑虽然没有技术理由POST有没有钥匙,其余的人强烈建议,对于POST有创建,它不应该有一个关键的不同含义。]
GET检索现有的对象。 该URI 可能有一个关键,取决于你是否在做单身GET或列表GET。 SQL选择
PUT更新现有的对象。 的URI具有密钥; 它接受消息主体,更新的对象。 SQL更新。
删除删除现有的对象。 该URI有一个关键。 在SQL中删除。
你可以更新POST而不是PUT记录? 不是没有引入一些歧义。 动词应该有明确的效果。 此外,POST URI的无项,其中PUT必须有一个关键。
当我的帖子,我希望创建一个201。 如果我不明白的是,什么是错的。 同样的,当我把,我期待一个200 OK。 如果我不明白的是,什么是错的。
我想你可以坚持一些不确定性,其中POST确实POST或PUT。 的URI必须是不同的; 还相关的消息可以是不同的。 一般来说,其余人采取从SQL的线索,其中INSERT和UPDATE是不同的动词。
你可以做,如果记录不存在或更新,如果记录不存在,该更新应插入的情况。 但是,如果更新意味着UPDATE和未能及时更新意味着什么是错的很简单。 一个秘密的回落到INSERT,使操作暧昧。
如果你没有构建一个RESTful接口,那么它是典型的只使用GET和POST的检索和创建/更新。 这是常见的有URI分歧或邮件内容分歧,POST区分当一个人点击提交表单上PUT。 然而,它是不是很干净,因为您的代码,以确定是否在POST是=创建案件或POST =更新情况。
POST没有的保证安全或幂等 。 这是原因PUT一个和DELETE导向轴PUT和DELETE是幂等的(即,1个+ N个相同的请求具有相同的最终结果仅有1请求)。
PUT用于在给定的URI 设置资源的状态。 当您发送POST请求在特定URI的资源, 该资源 不应该由内容所替代 。 在最,它应该被追加到。 这就是为什么POST不幂等,在附加职位的情况下,每个请求将增加的资源(例如,每次发布新的消息,讨论论坛)。
DELETE用于确保在给定的URI资源从服务器上删除。 POST通常不应被用于除了提交删除请求的情况下,删除。 再次,资源的URI你POST在这种情况下,不应该的URI,要删除该资源。 针对您张贴到任何资源是接收发布的数据追加到自身,添加到集合,或者以其他方式处理的资源。
HEAD被使用,如果所有你关心的是GET请求的头,你不希望在实际内容浪费带宽。 这是不错的。
为什么我们需要比POST吗? 它允许数据双向流动,那么,为什么会得到需要? 答案是基本相同的提问。 通过标准化的各种方法的基本期望其他进程可以更好地知道该怎么做。
例如,中介缓存代理可以做正确的事情的一个更好的机会。
想想头实例。 如果代理服务器知道光头装置,那么它可以处理从以前的GET请求来提供合适的答案HEAD请求的结果。 它可以知道,POST,PUT和DELETE不应该被缓存。
没有人贴我一直在寻找,所以我会尝试总结点自己这样回答的。
“基于REST的Web服务”一章8节“重载POST”记载:“如果你想要做的不PUT和完全删除,这是完全的RESTful通过GET暴露对资源安全运行,并通过重载POST所有其他操作这样做侵犯了我面向资源的架构,但它符合REST的较少限制的规则“。
总之, 更换PUT / DELETE赞成POST使得API难以阅读和PUT / DELETE通话将不再幂等 。
总之一句话:
幂等
在几句话:
GET =安全+幂
PUT =幂等
DELETE =幂等
POST =既不安全或幂
“幂”只是意味着你可以再做一遍又一遍,它会一直做同样的事情。
您可以重新发出一个PUT(更新)或你想删除请求很多次,这将有同样的效果,每次,但预期的效果将修改资源,因此不被认为是“安全”。
POST请求应该创建一个新的资源与每个请求,这意味着每一次的效果会有所不同。 因此POST不被认为是安全的或幂等。
像GET和HEAD方法只是读操作,因此被视为“安全”藏汉为幂等。
这实际上是一个非常重要的概念,因为它提供了一个标准的/一致的方式来解释HTTP交易; 这是一个安全上下文中特别有用。
并不是所有的主机托管服务提供商不支持PUT,DELETE。
我问这个问题,在一个理想的世界里,我们不得不所有动词,但是....:
RESTful Web服务和HTTP动词
HEAD是确定什么给定服务器的时钟(1秒或网络往返时间,以较高者为准内精确到)设置为真正有用的。 它也非常适合从Slashdot的越来越飞出个未来行情:
~$ curl -I slashdot.org HTTP/1.1 200 OK Date: Wed, 29 Oct 2008 05:35:13 GMT Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4 SLASH_LOG_DATA: shtml X-Powered-By: Slash 2.005001227 X-Fry: That's a chick show. I prefer programs of the genre: World's Blankiest Blank. Cache-Control: private Pragma: private Connection: close Content-Type: text/html; charset=iso-8859-1
对于卷曲 , -I
是用于执行HEAD请求的选项。 为了获得给定服务器的当前日期和时间,只是做
curl -I $server | grep ^Date
为了限制不确定性,这将允许我们简单的REST API的更好/更容易重用。
你可以只使用GET和POST,但那么你使用的部分PUT和DELETE带来的精确度和清晰度失去了。 POST是一个通配符操作,这可能意味着什么。 PUT和DELETE的行为是非常明确的。 如果你认为一个资源管理API的那么GET,PUT和DELETE可能覆盖80%的所需功能-90%。 如果你限制自己的GET和POST然后40%的API -60%使用指定的不良POST访问。
使用GET和POST的Web应用程序允许用户创建,查看,修改和删除自己的数据,但在HTTP之上的一层原本命令为这些目的而建立这样做。 一个REST背后的思路是回归到网页设计的初衷,因此有每个CRUD动词特定的HTTP操作。
另外,HEAD命令可用于改善(潜在大)的文件下载的用户体验。 你叫HEAD找出响应多大将是再调用get实际检索内容。
请参见下面的链接为一个说明性示例。 这也表明使用的选项HTTP方法,它还未在这里讨论的一种方式。
有HTTP扩展喜欢的WebDAV需要额外功能。
http://en.wikipedia.org/wiki/WebDAV
从早期的天Web服务器可能战争造成的。
在写在1996 HTTP 1.0,只有GET,HEAD,和POST 。 但你可以在看附录d ,厂商开始加入自己的东西。 所以,要保持HTTP兼容,他们被迫作出HTTP 1.1于1999年 。
然而,HTTP / 1.0没有充分考虑到分级代理,高速缓存,需要持久连接,或虚拟主机的作用。 此外,未完全实现应用自称为增殖“HTTP / 1.0”使得有必要为了使两个通信应用程序的协议版本的变化,以确定对方的真实能力。
本说明书中提及的协议定义为“HTTP / 1.1”。 这个协议包括比HTTP /以便确保可靠实现其功能1.0更严格的要求。
GET,PUT,DELETE和POST是从一个时代遗留下来的大二时认为,一个网页就可以减少到几hoighty-toity原则。
如今,大多数网页都是复合式实体,其中包含一些或所有这些原始的操作。 例如,网页中可能有一个用于查看或更新客户信息,这也许是跨越多个表的形式。
我通常使用$ _REQUEST []在PHP中,没有真正关心的信息如何到达。 我会选择使用基于效率,而不是基本的(多)范例GET或PUT方法。