重新了解 HTTP method 之二

續上次研讀了 HTTP method 的概觀後,這次讀的是 method 的屬性。

HTTP 定義了 method 有三種屬性如下。

安全性方法(Safe Methods)

HTTP 定義的「安全」其實指的就是唯讀(read-only)。

當 client 使用安全性方法的時候,不會請求 server 改變狀態,同時也不預期 server 的狀態會改變。而 server 被呼叫安全性方法的時候,則不預期影響 server 的狀態,或是造成資料損失等。

HTTP 定義安全性方法是唯讀,但實作還是多少會改變 server 的狀態。如(範例取自 RFC 原文裡)

  1. 大部分 server 都會寫 access log,因此即使呼叫安全方法,還是有機會發生空間滿載而影響服務狀態。
  2. 一個取得廣告的 API,通常是安全方法,但實際上取得廣告的同時,還會有「跟廣告主收費」的副作用。

為什麼要區分安全方法與「非安全」的方法?因為對 server 傷害較小,且不會改變 server 的狀態,因此可以用來讓爬蟲取得資料,或是利用 cache 改善效能。另一方面,當瀏覽器將要執行會變更狀態的操作(非安全的方法)時,可以知道要提醒使用者確認。

冪等性方法(Idempotent Methods)

白話地說,執行多次 request 對 server 造成的效果,與執行一次是一樣的。因為安全性方法不會對 server 造成任何效果,所以安全性方法也是屬於冪等性方法。

與安全性類似,冪等性的效果只會套用在使用者請求的內容中。比方說 server 的 access log、版本控制歷程等,這些與使用者請求無關的內容就不一定要符合冪等性。

冪等性好用的地方在於,當 client 連線中斷時,可以重覆執行。如發送 PUT 請求時,若遇到斷線,則可以再建立一個新的 PUT 請求,回應可能會有所不同,但效果是一樣的,不用擔心會有額外的副作用。

可快取方法(Cacheable Methods)

不依賴目前回傳的內容,不依賴認證授權的安全性方法,都可以定義成可快取方法。

細節可以參考 RFC 7234

References