post和get差別最核心的一點是:
快取機制的不同(能否被瀏覽器快取)
快取機制
這裡我們用到了開頭所講的冪等性概念。由於網路的不可靠,使得等冪性顯得特別重要,因此get、head、put、delete一定要設計成等冪的:如果一次請求,伺服器收到處理以後,客戶端沒有收到相應,客戶端會再次請求,如果沒有等冪性保障,就會發生意想不到的問題。
post是不等冪的,例如在segmentfault上兩次提交相同的文章,則會產生兩個資源。
通常HTTP 快取只適用於 idempotent request(冪等的請求),對於其他型別的響應則無能為力。
get請求的快取過程
第一次請求時,返回資料。
返回資料,在http頭部中包含last-modified(最後修改的時間) Etag(指示資源的狀態的唯一標識)Expires(指示資源在瀏覽器快取中的過期時間)
然後瀏覽器會將請求回的檔案放在Cache目錄下,並儲存上述資訊
發起第二次請求。
瀏覽器會先檢查Cache目錄中是否有該檔案,並且是否過期。同時滿足這兩個條件,則瀏覽器不會在向伺服器傳送請求,而是直接使用快取中的檔案。
否則,瀏覽器會傳送請求伺服器 ,並在頭部新增If-Modified-Since 和 If-None-Match。
如果檔案從上次訪問至今都沒有被修改過或Etag資訊沒有變化,則直接返回一個304的狀態,表明伺服器端允許請求訪問資源,但不滿足條件,返回不包含任何響應的主體部分。