1. 程式人生 > >GET和POST方法的真相

GET和POST方法的真相

GET和POST方法是HTTP協議規定的。查了HTTP1.1的RFC,原文的專業性極強。下面是白話翻譯,歡迎補充和指錯。
  GET方法就是檢索(以實體的形式)由請求uri所指定的資源。如果請求的uri指向資料產生的過程,應該把產生的資料應作為實體在響應中返回而不是源文字,除非原始檔指向輸出過程。
  如果請求訊息包含if Modified-Since、if - unmodify - since、if - match、if - none - match或if - range頭欄位,則GET方法的語義將更改為“條件GET”。條件GET方法要求實體僅在頭部的條件欄位描述的情況下進行傳輸。條件GET方法旨在減少不必要的網路使用,它允許快取的實體在不需要多個請求或傳輸客戶端已經擁有的資料的情況下進行重新整理。
  如果請求訊息包含範圍標頭欄位,GET方法的語義將變為“部分GET”。部分GET請求只傳輸實體的一部分。部分GET方法是為了減少不必要的網路使用,它允許在不傳輸客戶端已有資料的情況下完成部分檢索實體。
  當且僅當響應滿足“某些”HTTP快取需求時,對GET請求的響應是可快取。
  安全性考慮略。

POST方法用於向伺服器傳送請求報文。報文的body和start line被uri標識的資源是從屬關係。POST被設計來實現以下功能:(1)現有資源的註釋;(2)向公告欄、新聞組、郵件列表或類似的文章組釋出訊息;(3)向資料處理過程提供資料塊,如提交表單的結果;(4)通過追加操作擴充套件資料庫。
  POST方法執行的實際函式由伺服器決定,通常依賴於請求uri。post實體從屬於該uri,就像檔案從屬於父目錄。
  響應報文:POST方法執行的操作如果不產生可由URI標識的資源,響應碼可以是200 或204,是否包含實體看情況。如果伺服器上存在資源,響應碼應該是201,幷包含一個實體,該實體描述響應狀態並引用新資源,以及一個Location頭。
  POST方法的響應不可快取,除非響應包含適當的Cache-Control或Expires頭欄位。303響應可以用於指導使用者代理檢索可快取資源
  POST請求必須遵守某些訊息傳輸要求。
  有關安全考慮略。

總之,get方法的簡單語義就是檢索URI指定的資源。為了避免網路資源的浪費,協議允許響應使用快取。post的簡單語義就是向伺服器傳送資料,通常響應不可快取。
通常搜到的那些回答是怎麼回事呢?是其他協議和伺服器的“補充規定,下次再說。最後一句話不負責:)”

-參考資料 rfc2616 超文字傳輸協議——HTTP/1.1