重新了解 HTTP method 之二
續上次研讀了 HTTP method 的概觀後,這次讀的是 method 的屬性。
HTTP 定義了 method 有三種屬性如下。
安全性方法(Safe Methods)
HTTP 定義的「安全」其實指的就是唯讀(read-only)。
當 client 使用安全性方法的時候,不會請求 server 改變狀態,同時也不預期 server 的狀態會改變。而 server 被呼叫安全性方法的時候,則不預期影響 server 的狀態,或是造成資料損失等。
HTTP 定義安全性方法是唯讀,但實作還是多少會改變 server 的狀態。如(範例取自 RFC 原文裡)
- 大部分 server 都會寫 access log,因此即使呼叫安全方法,還是有機會發生空間滿載而影響服務狀態。
- 一個取得廣告的 API,通常是安全方法,但實際上取得廣告的同時,還會有「跟廣告主收費」的副作用。
為什麼要區分安全方法與「非安全」的方法?因為對 server 傷害較小,且不會改變 server 的狀態,因此可以用來讓爬蟲取得資料,或是利用 cache 改善效能。另一方面,當瀏覽器將要執行會變更狀態的操作(非安全的方法)時,可以知道要提醒使用者確認。
冪等性方法(Idempotent Methods)
白話地說,執行多次 request 對 server 造成的效果,與執行一次是一樣的。因為安全性方法不會對 server 造成任何效果,所以安全性方法也是屬於冪等性方法。
與安全性類似,冪等性的效果只會套用在使用者請求的內容中。比方說 server 的 access log、版本控制歷程等,這些與使用者請求無關的內容就不一定要符合冪等性。
冪等性好用的地方在於,當 client 連線中斷時,可以重覆執行。如發送 PUT 請求時,若遇到斷線,則可以再建立一個新的 PUT 請求,回應可能會有所不同,但效果是一樣的,不用擔心會有額外的副作用。
可快取方法(Cacheable Methods)
不依賴目前回傳的內容,不依賴認證授權的安全性方法,都可以定義成可快取方法。
細節可以參考 RFC 7234
References
- RFC 7231
- Safe - MDN
- Idempotent - MDN