GET參數經過URL傳遞,POST放在Request body中。html
對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。面試
GET在瀏覽器回退時是無害的,而POST會再次提交請求。瀏覽器
GET產生的URL地址能夠被Bookmark,而POST不能夠。緩存
GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。安全
GET請求只能進行url編碼,而POST支持多種編碼方式。服務器
GET請求在URL中傳送的參數是有長度限制的,而POST麼有。併發
GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。tcp
GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。post
TCP就像汽車,咱們用TCP來運輸數據,它很可靠,歷來不會發生丟件少件的現象。可是若是路上跑的全是看起來如出一轍的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統必定會癱瘓。編碼
爲了不這種狀況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類別,有GET, POST, PUT, DELETE等等。HTTP規定:當執行GET請求的時候,要給汽車貼上GET的標籤(設置method爲GET),並且要求把傳送的數據放在車頂上(URL中)以方便記錄;若是是POST請求,則要在車上貼上POST的標籤,並把貨物放在車箱裏。(固然,你也能夠在GET的時候往車箱內偷偷藏點貨物,可是這是很不光彩;亦可在POST的時候在車頂上也放一些數據,讓人以爲傻乎乎的~)
<HTTP只是個行爲準則,而TCP纔是GET和POST方法實現的基本>
此外,還有另外一個重要的角色:運輸公司。不一樣的瀏覽器(發起http請求)和服務器(接受http請求)就是不一樣的運輸公司。 雖然理論上,你能夠在車頂上無限的堆貨物(即在URL中無限加參數)。可是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。
業界不成文的規定是,(大多數)瀏覽器一般都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。超過的部分,恕不處理。若是你用GET服務,在request body偷偷藏了數據,不一樣服務器的處理方式也是不一樣的,有些服務器會幫你卸貨,讀出數據,有些服務器則直接忽略。因此,雖然GET能夠帶request body,也並不能保證必定能被接收到哦。
GET只須要汽車跑一趟就把貨送到了,而POST得跑兩趟:第一趟,先去和服務器打個招呼「嗨,我等下要送一批貨來,大家打開門迎接我」,而後再回頭把貨送過去。