區(qū)別
- get表達(dá)的是一種冪等的,純粹的只讀操作,即它除了返回結(jié)果不應(yīng)該會(huì)產(chǎn)生其它副作用(如寫數(shù)據(jù)庫)。因此絕大部分get請(qǐng)求(通常超過90%)都直接被CDN緩存了,這能大大減少web服務(wù)器的負(fù)擔(dān)。
- 而post所表達(dá)的語義是非冪等的,可能進(jìn)行增刪改的操作,所以必須交由web服務(wù)器處理。
注意它們只是表達(dá)上的不同,強(qiáng)調(diào)語義。用get來傳輸要插入的數(shù)據(jù),用post來傳輸要查詢的數(shù)據(jù)標(biāo)識(shí)都是可以的,只要請(qǐng)求打到了服務(wù)器上,管你是post還是get,怎么處理是服務(wù)器的事
post
-
一個(gè)最簡(jiǎn)單的用戶名密碼表單提交通常會(huì)會(huì)發(fā)送post request,請(qǐng)求頭是這樣的:
Paste_Image.png
指明方法為post,還有實(shí)體頭部信息包含請(qǐng)求體的內(nèi)容長(zhǎng)度與類型(x-www-form-urlencoded表示數(shù)據(jù)被編碼為名稱/值對(duì),這是標(biāo)準(zhǔn)的編碼格式。)。這是請(qǐng)求體:uname=&pwd=&sbt=%E6%8F%90%E4%BA%A4, 亂七八糟那部分就是‘提交’中文二字的utf-8編碼。PS:若是傳統(tǒng)表單按鈕<input type="submit">提交,則會(huì)把提交按鈕的value加入請(qǐng)求體。
有時(shí)post請(qǐng)求的content-type并非form格式數(shù)據(jù),還可以是json格式數(shù)據(jù)。例如$.ajax()可以指定
$.ajax({
...
contentType: "application/json; charset=utf-8", dataType: "json",
data: JSON.stringify(obj)
...});
此時(shí)請(qǐng)求體:{"uname":"","pwd":""} 。
POST 是否比 GET 安全
POST要比GET安全一點(diǎn)點(diǎn)。。。兩者都是明文傳送,但是GET的URL會(huì)被放在瀏覽器歷史和WEB 服務(wù)器日志里面,query會(huì)被記錄;而POST 發(fā)完基本就木有了。所以如果關(guān)鍵數(shù)據(jù)放在GET里面,被人偷窺了瀏覽器,或者WEB服務(wù)器被入侵日志被人倒去了,基本泄露可能性100%。而POST來說,日志沒有記錄,只要數(shù)據(jù)庫服務(wù)器不被入侵,基本還是安全的。
當(dāng)然如果被抓了包,這一切都沒有什么卵用,所以,HTTPS該用還是得用。
使用準(zhǔn)則
- 可以重復(fù)的交互,比如取個(gè)數(shù)據(jù),跳個(gè)頁面, 用GET
- 不可以重復(fù)的操作, 比如創(chuàng)建一個(gè)條目/修改一條記錄, 用POST, 因?yàn)镻OST不能被緩存,所以瀏覽器不會(huì)多次提交。
參考:post 相比get 有很多優(yōu)點(diǎn),為什么現(xiàn)在的HTTP通信中大多數(shù)請(qǐng)求還是使用get?
