patch
方法用來更新局部資源,這句話我們該如何理解?
假設我們有一個UserInfo
,里面有userId
, userName
, userGender
等10個字段。可你的編輯功能因為需求,在某個特別的頁面里只能修改userName
,這時候的更新怎么做?
人們通常(為徒省事)把一個包含了修改后userName
的完整userInfo
對象傳給后端,做完整更新。但仔細想想,這種做法感覺有點二,而且真心浪費帶寬(純技術上講,你不關心帶寬那是你土豪)。
於是patch
誕生,只傳一個userName
到指定資源去,表示該請求是一個局部更新,后端僅更新接收到的字段。
而put
雖然也是更新資源,但要求前端提供的一定是一個完整的資源對象,理論上說,如果你用了put
,但卻沒有提供完整的UserInfo
,那么缺了的那些字段應該被清空PATCH 與 PUT 屬性上的一個重要區別還在於:PUT 是冪等的,而 PATCH 不是冪等的。
冪等是一個數學和計算機學概念,在計算機范疇內表示一個操作執行任意次對系統的影響跟一次是相同。
在HTTP/1.1規范中冪等性的定義是:
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.
如:POST 方法不是冪等的,若反復執行多次對應的每一次都會創建一個新資源。如果請求超時,則需要回答這一問題:資源是否已經在服務端創建了?能否再重試一次或檢查資源列表?而對於冪等方法不存在這一個問題,我們可以放心地多次請求。
補充:
最后再補充一句,restful
只是標准,標准的意思是如果在大家都依此行事的話,溝通成本會很低,開發效率就高。但並非強制(也沒人強制得了),所以你說在你的程序里把方法名從put
改成patch
沒有任何影響,那是自然,因為你的后端程序並沒有按照標准對兩個方法做不同處理,她的表現自然是一樣的