突如其來的視頻面試讓我措手不及,努力在腦海中搜尋塵封的知識卻一無所獲,所以復習后將它記錄下來,希望能夠幫助到閱讀這篇博客的你們,
首先是大家最熟悉的,也就是W3School給出的“答案”:
GET
請注意,查詢字串(名稱/值對)是在GET請求的URL中發送的:
/test/demo_form.php?name1=value1&name2=value2
- GET請求可以被快取
- GET請求保留在瀏覽器歷史記錄中
- GET請求可以加書簽
- 處理敏感資料時,切勿使用GET請求
- GET請求有長度限制
- GET請求僅用于請求資料(不修改)
POST
POST用于將資料發送到服務器以創建/更新資源,
通過POST發送到服務器的資料存盤在HTTP請求的請求主體中
POST /test/demo_form.php HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
- POST請求永遠不會被快取
- POST請求不會保留在瀏覽器歷史記錄中
- POST請求無法添加書簽
- POST請求對資料長度沒有限制
這份來自W3School的標準答案,詳細闡述了二者的區別,但是這還不夠,
首先我們需要學習一個術語,叫做“冪等(idempotent)”,如果我們說一個HTTP方法是冪等的,意思是同樣的請求被執行一次與連續執行多次的效果是一樣的,換句話說,冪等方法不應該具有副作用,在正確實作的條件下GET,HEAD,PUT,DELETE等方法都是冪等的,而POST方法不是,所有的safe方法也都是冪等的,
冪等性只與后端服務器的實際狀態有關,而每一次請求接收到的狀態碼不一定相同,例如,第一次呼叫DELETE方法有可能回傳200,但是后續的請求可能會回傳404,DELETE的言外之意是,開發者不應該使用DELETE方法實作具有洗掉最后條目功能的 RESTful API,
GET /pageX HTTP/1.1是冪等的,連續呼叫多次,客戶端接收到的結果都是一樣的:
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
POST /add_row HTTP/1.1不是冪等的,如果呼叫多次,就會增加多行記錄:
POST /add_row HTTP/1.1
POST /add_row HTTP/1.1 -> Adds a 2nd row
POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1是冪等的,即便是不同請求之間接收到的狀態碼不一樣:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1 -> Returns 404
所以并不是POST和GET哪個更安全的問題,它們的用處就是不同的:
GET用于查看某些內容而不進行更改,或者說用于檢索遠程資料,請求指定的資源
POST用于更改某些內容,即提交處理資料給標識的資源
例如,搜索頁面應使用GET,而更改密碼的表單應使用POST,
在HTTP/1.1規范(RFC 2616)第15節安全注意事項(Security Considerations)中解釋了為什么只應使用GET來檢索資料:
Authors of services which use the HTTP protocol SHOULD NOT use GET based forms for the submission of sensitive data, because this will cause this data to be encoded in the Request-URI. Many existing servers, proxies, and user agents will log the request URI in someplace where it might be visible to third parties. Servers can use POST-based form submission instead
大致意思如下:使用HTTP協議的作者不應使用GET提交敏感資料,因為這將導致資料被編碼在請求URI中,許多現有的服務器、代理、和用戶代理將在第三方的一些地方可以看到,服務器可以改用基于POST的表單提交,
在PHP中,二者的概念有些混亂,POST請求從查詢字串以及通過請求正文獲取輸入, GET請求僅從查詢字串獲取輸入,因此,我們可以說POST請求是GET請求的超集,您可以在POST請求中使用$ _GET,甚至在$ _POST和$ _GET中使用具有相同名稱的引數甚至意味著不同的含義,甚至可能是有意義的,
例如,假設您有一個用于編輯文章的表單,標題ID可能在查詢字串中,使用$ _GET ['id']獲得,但是假設您要更改標題ID,新的ID會出現在請求正文中:$_POST['id'],
最后還有非常重要的一點,在將GET方法應用于AJAX請求時,一些瀏覽器會快取請求的結果,尤其是IE瀏覽器,因此,如果您使用相同的GET請求進行輪詢,則即使要查詢的資料在服務器端更新了,也將始侄訓傳相同的結果,緩解此問題的一種方法是,通過附加時間戳使每個請求的URL唯一,
我們可以使用如下代碼進行實作:
var timestamp = new Date().getTime();
url = url + '?t=' + timestamp;
在我的畢業設計中就被這個問題所困擾,但我并沒有意識到這是由于GET方法的冪等特性造成的,通過這次復習,我學會了遺忘的知識,也獲得了新的知識,
這篇博文更像是一篇筆記了,結構有點亂,比較隨心所欲,希望能夠幫助到閱讀到這篇博文的你,如果你喜歡這篇博文,還請給個贊或者一鍵三連,謝謝支持!
參考目錄:
StackOverflow:What is the difference between POST and GET? [duplicate]
StackOverflow:When should I use GET or POST method? What's the difference between them?
W3C:Protocol -- HTTP/1.1 RFC 2616:15 Security Considerations
W3School:HTTP Request Methods
php.net:$_POST
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/192387.html
標籤:java
上一篇:B/S網頁制作
