【转】HTTP协议中PUT和POST使用区别
? ? 有的觀點(diǎn)認(rèn)為,應(yīng)該用POST來(lái)創(chuàng)建一個(gè)資源,用PUT來(lái)更新一個(gè)資源;有的觀點(diǎn)認(rèn)為,應(yīng)該用PUT來(lái)創(chuàng)建一個(gè)資源,用POST來(lái)更新一個(gè)資源;還有的觀點(diǎn)認(rèn)為可以用PUT和POST中任何一個(gè)來(lái)做創(chuàng)建或者更新一個(gè)資源。這些觀點(diǎn)都只看到了風(fēng)格,爭(zhēng)論起來(lái)也只是爭(zhēng)論哪種風(fēng)格更好,其實(shí),用PUT還是POST,不是看這是創(chuàng)建還是更新資源的動(dòng)作,這不是風(fēng)格的問(wèn)題,而是語(yǔ)義的問(wèn)題。
在HTTP中,PUT被定義為idempotent的方法,POST則不是,這是一個(gè)很重要的區(qū)別。
? ?“Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.”
上面的話就是說(shuō),如果一個(gè)方法重復(fù)執(zhí)行多次,產(chǎn)生的效果是一樣的,那就是idempotent的。
? ? ? 舉一個(gè)簡(jiǎn)單的例子,假如有一個(gè)博客系統(tǒng)提供一個(gè)Web API,模式是這樣http://superblogging/blogs/post/{blog-name},很簡(jiǎn)單,將{blog-name}替換為我們的blog名字,往這個(gè)URI發(fā)送一個(gè)HTTP PUT或者POST請(qǐng)求,HTTP的body部分就是博文,這是一個(gè)很簡(jiǎn)單的REST API例子。我們應(yīng)該用PUT方法還是POST方法?取決于這個(gè)REST服務(wù)的行為是否是idempotent的,假如我們發(fā)送兩個(gè)http://superblogging/blogs/post/Sample請(qǐng)求,服務(wù)器端是什么樣的行為?如果產(chǎn)生了兩個(gè)博客帖子,那就說(shuō)明這個(gè)服務(wù)不是idempotent的,因?yàn)槎啻问褂卯a(chǎn)生了副作用了嘛;如果后一個(gè)請(qǐng)求把第一個(gè)請(qǐng)求覆蓋掉了,那這個(gè)服務(wù)就是idempotent的。前一種情況,應(yīng)該使用POST方法,后一種情況,應(yīng)該使用PUT方法。
?
? ? ? 也許你會(huì)覺(jué)得這個(gè)兩個(gè)方法的差別沒(méi)什么大不了的,用錯(cuò)了也不會(huì)有什么問(wèn)題,但是你的服務(wù)一放到internet上,如果不遵從HTTP協(xié)議的規(guī)范,就可能給自己帶來(lái)麻煩。比如,沒(méi)準(zhǔn)Google Crawler也會(huì)訪問(wèn)你的服務(wù),如果讓一個(gè)不是indempotent的服務(wù)可以用indempotent的方法訪問(wèn),那么你服務(wù)器的狀態(tài)可能就會(huì)被Crawler修改,這是不應(yīng)該發(fā)生的
?
一個(gè)HTTP方法是冪等的,指的是同樣的請(qǐng)求被執(zhí)行一次與連續(xù)執(zhí)行多次的效果是一樣的,服務(wù)器的狀態(tài)也是一樣的。換句話說(shuō)就是,冪等方法不應(yīng)該具有副作用(統(tǒng)計(jì)用途除外)。在正確實(shí)現(xiàn)的條件下,GET,HEAD,PUT和DELETE?等方法都是冪等的,而?POST?方法不是。所有的?safe?方法也都是冪等的。
冪等性只與后端服務(wù)器的實(shí)際狀態(tài)有關(guān),而每一次請(qǐng)求接收到的狀態(tài)碼不一定相同。例如,第一次調(diào)用DELETE?方法有可能返回?200,但是后續(xù)的請(qǐng)求可能會(huì)返回404。DELETE?的言外之意是,開(kāi)發(fā)者不應(yīng)該使用DELETE方法實(shí)現(xiàn)具有刪除最后條目功能的 RESTful API。
需要注意的是,服務(wù)器不一定會(huì)確保請(qǐng)求方法的冪等性,有些應(yīng)用可能會(huì)錯(cuò)誤地打破冪等性約束。
GET /pageX HTTP/1.1是冪等的。連續(xù)調(diào)用多次,客戶(hù)端接收到的結(jié)果都是一樣的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1POST /add_row HTTP/1.1不是冪等的。如果調(diào)用多次,就會(huì)增加多行記錄:
POST /add_row HTTP/1.1 POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd rowDELETE /idX/delete HTTP/1.1是冪等的,即便是不同請(qǐng)求之間接收到的狀態(tài)碼不一樣:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404總結(jié)
以上是生活随笔為你收集整理的【转】HTTP协议中PUT和POST使用区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 债券基金和理财产品哪个好?从四个角度对比
- 下一篇: 春节期间可以信用卡自助还款吗