p_網(wǎng)絡工具類

  • 1.post、put、patch:與冪等性
    總:
    用于上傳數(shù)據(jù)的方法只有POST、PUT、PATCH。
    PUT方法和PATCH方法所請求的目標地址都是直接指向資源的,而POST方法請求的目標是一個行為處理器。PUT用于替換資源,而PATCH用于更新部分資源。
    分:
    POST所對應的URI并非創(chuàng)建的資源本身,而是資源的接收者。比如:POST http://www.forum.com/articles 的語義是在http://www.forum.com/articles 下創(chuàng)建一篇帖子,HTTP響應中應包含帖子的創(chuàng)建狀態(tài)以及帖子的URI。兩次相同的POST請求會在服務器端創(chuàng)建兩份資源,它們具有不同的URI;所以,POST方法不具備冪等性。
    而PUT所對應的URI是要創(chuàng)建或更新的資源本身。比如:PUT http://www.forum/articles/4231 的語義是創(chuàng)建或更新ID為4231的帖子。對同一URI進行多次PUT的副作用和一次PUT是相同的;因此,PUT方法有冪等性。

POST方法非冪等可以理解,因為它請求服務器執(zhí)行一個動作,多次發(fā)起請求可能導致動作多次執(zhí)行。
而像PATCH這樣請求的目標是一個資源的,PATCH方法和POST方法有個很相似的地方,它們的實體部分都是結構化的數(shù)據(jù)。POST方法的實體結構一般是 multipart/form-data 或 application/x-www-form-urlencoded 而PATCH方法的實體結構則隨其它規(guī)范定義。
這和PUT方法的無結構實體相比就是最大的區(qū)別。  PUT方法的實體無結構的,它直接把實體部分的數(shù)據(jù)替換到服務器的資源上。f而PATCH提供的實體則需要根據(jù)程序或其它協(xié)議的定義,解析后在服務器上執(zhí)行,以此來修改服務器上的數(shù)據(jù)。也就是說,PATCH請求是會執(zhí)行某個程序的,如果重復提交,程序可能執(zhí)行多次,對服務器上的資源就可能造成額外的影響,這就可以解釋它為什么是不冪等的了。


  • 2.為什么需要冪等性呢?我們先從一個例子說起,假設有一個從賬戶取錢的遠程API(可以是HTTP的,也可以不是),我們暫時用類函數(shù)的方式記為:

bool withdraw(account_id, amount)
withdraw的語義是從account_id對應的賬戶中扣除amount數(shù)額的錢;如果扣除成功則返回true,賬戶余額減少amount;如果扣除失敗則返回false,賬戶余額不變。值得注意的是:和本地環(huán)境相比,我們不能輕易假設分布式環(huán)境的可靠性。一種典型的情況是withdraw請求已經(jīng)被服務器端正確處理,但服務器端的返回結果由于網(wǎng)絡等原因被掉丟了,導致客戶端無法得知處理結果。如果是在網(wǎng)頁上,一些不恰當?shù)脑O計可能會使用戶認為上一次操作失敗了,然后刷新頁面,這就導致了withdraw被調(diào)用兩次,賬戶也被多扣了一次錢。

另一種更輕量級的解決方案是冪等設計。我們可以通過一些技巧把withdraw變成冪等的,比如:
int create_ticket() bool idempotent_withdraw(ticket_id, account_id, amount)

create_ticket的語義是獲取一個服務器端生成的唯一的處理號ticket_id,它將用于標識后續(xù)的操作。idempotent_withdraw和withdraw的區(qū)別在于關聯(lián)了一個ticket_id,一個ticket_id表示的操作至多只會被處理一次,每次調(diào)用都將返回第一次調(diào)用時的處理結果。這樣,idempotent_withdraw就符合冪等性了,客戶端就可以放心地多次調(diào)用。
基于冪等性的解決方案中一個完整的取錢流程被分解成了兩個步驟:1.調(diào)用create_ticket()獲取ticket_id;2.調(diào)用idempotent_withdraw(ticket_id, account_id, amount)。雖然create_ticket不是冪等的,但在這種設計下,它對系統(tǒng)狀態(tài)的影響可以忽略,加上idempotent_withdraw是冪等的,所以任何一步由于網(wǎng)絡等原因失敗或超時,客戶端都可以重試,直到獲得結果。如圖2所示:


idempotent

  • 3.說一下get 、delete:
    HTTP GET方法用于獲取資源,不應有副作用,所以是冪等的。比如:GET http://www.bank.com/account/123456 ,不會改變資源的狀態(tài),不論調(diào)用一次還是N次都沒有副作用。請注意,這里強調(diào)的是一次和N次具有相同的副作用,而不是每次GET的結果相同。GET http://www.news.com/latest-news 這個HTTP請求可能會每次得到不同的結果,但它本身并沒有產(chǎn)生任何副作用,因而是滿足冪等性的。

HTTP DELETE方法用于刪除資源,有副作用,但它應該滿足冪等性。比如:DELETE http://www.forum.com/article/4231 ,調(diào)用一次和N次對系統(tǒng)產(chǎn)生的副作用是相同的,即刪掉id為4231的帖子;因此,調(diào)用者可以多次調(diào)用或刷新頁面而不必擔心引起錯誤。

  • 4.說一下post 和 get的區(qū)別?

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 前言 HTTP Method的歷史: HTTP 0.9 這個版本只有GET方法 HTTP 1.0 這個版本有G...
    老馬的春天閱讀 26,086評論 3 9
  • 如果要追根溯源,冪等性是數(shù)學中的一個概念,表達的是N次變換與1次變換的結果相同。 基于HTTP協(xié)議的Web API...
    Ray雷磊閱讀 1,933評論 0 1
  • 轉(zhuǎn)載自 Programming.log - a place to keep my thoughts on prog...
    廚子閱讀 438評論 0 4
  • 理解HTTP冪等性 基于HTTP協(xié)議的Web API是時下最為流行的一種分布式服務提供方式。無論是在大型互聯(lián)網(wǎng)應用...
    阿燈_supwinr閱讀 488評論 0 0
  • 關于數(shù)據(jù)庫的淺顯認知# -什么是數(shù)據(jù)庫?-數(shù)據(jù)的集散地,能夠有效的存儲和管理數(shù)據(jù)-關系型數(shù)據(jù)庫:關系型數(shù)據(jù)庫:1....
    hoggenWang閱讀 751評論 0 0

友情鏈接更多精彩內(nèi)容