1. 程式人生 > >學習筆記--post 相比get 有很多優點,為什麼現在的HTTP通訊中大多數請求還是使用get?

學習筆記--post 相比get 有很多優點,為什麼現在的HTTP通訊中大多數請求還是使用get?

作者:羅志宇
連結:https://www.zhihu.com/question/31640769/answer/52824098
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

好吧, 除了哲學方式的回答以外,下面是一個瀏覽器從業人員的看法

事實上GET 和 POST 在實踐上面有非常大的區別,這兩種方法在語義上面並非能互相取代。

POST 是否比 GET 安全

是的, POST要比GET安全一點點,注意,是一點點。。。

說這兩者都是明文傳送當然是沒有錯的了,但是這裡有一個細節,就是GET的URL會被放在瀏覽器歷史和WEB 伺服器日誌裡面。

POST 發完基本就木有了。。

所以如果你把關鍵資料放在GET裡面,被人偷窺了瀏覽器,或者WEB伺服器被入侵日誌被人倒去了,基本洩露可能性100%。而POST來說,日誌沒有記錄,只要資料庫伺服器不被入侵,基本還是安全的。

當然如果被抓了包,這一切都沒有什麼卵用,所以,HTTPS該用還是得用。



GET 相對 POST 的優勢是什麼


最大的優勢是, GET 的URL可以人肉手輸啊。。。你在位址列打個POST給我看看。本質上面, GET 的所有資訊都在URL, 所以很方便的記錄下來重複使用。

所以如果你希望
- 請求中的URL可以被手動輸入
- 請求中的URL可以被存在書籤裡,或者歷史裡,或者快速撥號裡面,或者分享給別人。
- 請求中的URL是可以被搜尋引擎收錄的。
- 帶雲壓縮的瀏覽器,比如Opera mini/Turbo 2, 只有GET才能在伺服器端被預取的。
- 請求中的URL可以被快取。

請使用GET.

大家有沒有注意到,其實這裡面很多方面的要求是和網站的運營相關的,而不是技術相關的。任何的技術行為中,其實多多少少都能看到商業的影子。

反之,就用POST. 特別是有一些東西你是不想讓人家可以在瀏覽器位址列裡面可以輸入的。比如,如果你設計一個blog系統, 設計這樣一個URL來刪掉所有帖子。

http://myblog.com/?action=delete_all

我只能說很快你就知道什麼叫不作死就不會死這個道理了,搜尋引擎的爬蟲分分鐘教你做人。

另外一個準則是,可以重複的互動,比如取個數據,跳個頁面, 用GET.
不可以重複的操作, 比如建立一個條目/修改一條記錄, 用POST, 因為POST不能被快取,所以瀏覽器不會多次提交。

WEB API 的設計相對於網頁來說更加複雜,同時也有GET/POST的問題,目前主流接受的方法是RESTful, 參見這裡

Representational state transfer

這個是趨勢:

同時對於何時用GET, W3C 也有一篇文章專門解釋:
w3.org/2001/tag/doc/whe


摘一點出來:

1.3 Quick Checklist for Choosing HTTP GET or POST

  • Use GET if:
    • The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).

and

  • Use POST if:
    • The interaction is more like an order, or
    • The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or o The user be held accountable for the results of the interaction.

However, before the final decision to use HTTP GET or POST, please also consider considerations for sensitive data and practical considerations.