【JavaScript】2.Http中Get與Post兩種請求方式的差異
Get和Post在面試中一般都會問到,一般的區別:
(1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中)
(2)post傳送的資料更大(get有url長度限制)
(3)post能傳送更多的資料型別(get只能傳送ASCII字元)
(4)post比get慢
(5)post用於修改和寫入資料,get一般用於搜尋排序和篩選之類的操作(淘寶,支付寶的搜尋查詢都是get提交),目的是資源的獲取,讀取資料
雖然在開發中經常用get或者post請求,但是由於我們資歷經驗的欠缺,或許就重來沒有深究過什麼場合用get請求,什麼場合用post請求,我相信不止我一個人當看到第4,5條的時候,就會明白為什麼面試官對我們的回答不滿意,也明白了自己對get或post用法理解的欠缺,那麼get比post更快,究竟快多少呢?表現在那些方面?
一、為什麼get比post更快
1.post請求包含更多的請求頭
因為post需要在請求的body部分包含資料,所以會多了幾個資料描述部分的首部欄位(如:content-type),這其實是微乎其微的。
2.最重要的一條,post在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料
post請求的過程:
(1)瀏覽器請求tcp連線(第一次握手)
(2)伺服器答應進行tcp連線(第二次握手)
(3)瀏覽器確認,併發送post請求頭(第三次握手,這個報文比較小,所以http會在此時進行第一次資料傳送)
(4)伺服器返回100 Continue響應
(5)瀏覽器傳送資料
(6)伺服器返回200 OK響應
get請求的過程:
(1)瀏覽器請求tcp連線(第一次握手)
(2)伺服器答應進行tcp連線(第二次握手)
(3)瀏覽器確認,併發送get請求頭和資料(第三次握手,這個報文比較小,所以http會在此時進行第一次資料傳送)
(4)伺服器返回200 OK響應
也就是說,目測get的總耗是post的2/3左右,這個口說無憑,網上已經有網友進行過測試。
3.get會將資料快取起來,而post不會
可以做個簡短的測試,使用ajax採用get方式請求靜態資料(比如html頁面,圖片)的時候,如果兩次傳輸的資料相同,第二次以後消耗的時間將會在10ms以內(chrome測試),而post每次消耗的時間都差不多。經測試,chrome和firefox下如果檢測到get請求的是靜態資源,則會快取,如果是資料,則不會快取,但是IE什麼都會快取起來,當然,應該沒有人用post去獲取靜態資料吧,反正我是沒見過。
4.post不能進行管道化傳輸
http權威指南中是這樣說的:http的一次會話需要先建立tcp連線(大部分是tcp,但是其他安全協議也是可以的),然後才能通訊,如果 每次連線都只進行一次http會話,那這個連線過程佔的比例太大了!於是出現了持久連線:在http/1.0+中是connection首部中新增keep-alive值,在http/1.1中是在connection首部中新增persistent值,當然兩者不僅僅是命名上的差別,http/1.1中,持久連線是預設的,除非顯示在connection中新增close,否則持久連線不會關閉,而http/1.0+中則恰好相反,除非顯示在connection首部中新增keep-alive,否則在接收資料包後連線就斷開了。
出現了持久連線還不夠,在http/1.1中,還有一種稱為管道通訊的方式進行速度優化:把需要傳送到伺服器上的所有請求放到輸出佇列中,在第一個請求傳送出去後,不等到收到伺服器的應答,第二個請求緊接著就傳送出去,但是這樣的方式有一個問題:不安全,如果一個管道中有10個連線,在傳送出9個後,突然伺服器告訴你,連線關閉了,此時客戶端即使收到了前9個請求的答覆,也會將這9個請求的內容清空,也就是說,白忙活了……此時,客戶端的這9個請求需要重新發送。這對於冪等請求還好(比如get,多傳送幾次都沒關係,每次都是相同的結果),如果是post這樣的非冪等請求(比如支付的時候,多傳送幾次就慘了),肯定是行不通的。
所以,post請求不能通過管道的方式進行通訊!很有可能,post請求需要重新建立連線,這個過程不跟完全沒優化的時候一樣了麼?所以,在可以使用get請求通訊的時候,不要使用post請求,這樣使用者體驗會更好,當然,如果有安全性要求的話,post會更好。管道化傳輸在瀏覽器端的實現還需考證,貌似預設情況下大部分瀏覽器(除了opera)是不進行管道化傳輸的,除非手動開啟!
二、get傳參最大長度的理解誤區
1.總結
(1)http協議並未規定get和post的長度限制
(2)get的最大長度限制是因為瀏覽器和web伺服器限制了URL的長度
(3)不同的瀏覽器和web伺服器,限制的最大長度不一樣
(4)要支援IE,則最大長度為2083byte,若支援Chrome,則最大長度8182byte
2.誤解
(1)首先即使get有長度限制,也是限制的整個URL的長度,而不僅僅是引數值資料長度,http協議從未規定get/post的請求長度限制是多少
(2)所謂的請求長度限制是由瀏覽器和web伺服器決定和設定的,各種瀏覽器和web伺服器的設定均不一樣,這依賴於各個瀏覽器廠家的規定或者可以根據web伺服器的處理能力來設定。IE 和 Safari 瀏覽器 限制 2k,Opera 限制4k,Firefox 限制 8k(非常老的版本 256byte),如果超出了最大長度,大部分的伺服器直接截斷,也有一些伺服器會報414錯誤。
3.各個瀏覽器和web伺服器的最大長度總結
瀏覽器
(1)IE:IE瀏覽器(Microsoft Internet Explorer) 對url長度限制是2083(2K+53),超過這個限制,則自動截斷(若是form提交則提交按鈕不起作用)。
(2)firefox:firefox(火狐瀏覽器)的url長度限制為 65536字元,但實際上有效的URL最大長度不少於100,000個字元。
(3)chrome:chrome(谷歌)的url長度限制超過8182個字元返回本文開頭時列出的錯誤。
(4)Safari:Safari的url長度限制至少為 80 000 字元。
(5)Opera:Opera 瀏覽器的url長度限制為190 000 字元。Opera9 位址列中輸入190000字元時依然能正常編輯。
伺服器
(1)Apache:Apache能接受url長度限制為8 192 字元
(2)IIS:Microsoft Internet Information Server(IIS)能接受url長度限制為16384個字元。這個是可以通過修改的(IIS7)
configuration/system.webServer/security/requestFiltering/[email protected]<requestLimitsmaxQueryString="length"/>
(3)Perl HTTP::Daemon
Perl HTTP::Daemon 至少可以接受url長度限制為8000字元。PerlHTTP::Daemon中限制HTTP request headers的總長度不超過16 384位元組(不包括post,fileuploads等)。但當url超過8000字元時會返回413錯誤。這個限制可以被修改,在Daemon.pm查詢16×1024並更改成更大的值。
(4)ngnix:可以通過修改配置來改變url請求串的url長度限制。
client_header_buffer_size 預設值:client_header_buffer_size1k
large_client_header_buffers預設值 :large_client_header_buffers 4 4k/8k
由於jsonp跨域請求只能通過get請求,url長度根據瀏覽器及伺服器的不同而有不同限制。若要支援IE的話,url長度限制為2083字元,若是中文字元的話只有2083/9=231個字元。若是Chrome瀏覽器支援的最大中文字元只有8182/9=909個。
相關推薦
【JavaScript】2.Http中Get與Post兩種請求方式的差異
Get和Post在面試中一般都會問到,一般的區別: (1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中) (2)post傳送的資料更大(get有url長度限制) (3)post能傳送更多的資料型別(get只能傳送ASCII字元)
form表單中get和post兩種提交方式的區別
name bsp inpu get div post input 普通 表單 一、form表單中get和post兩種提交方式的區別? 1.get提交表單中的內容在鏈接處是可見的。post不可見 2.post相比於get是安全的 3.post不收限制大小,get有
ajax中get和post兩種請求的區別
Ajax(Asynchronous Javascript And XML)即非同步JavaScript和XML,通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新;這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新(即區域性重新整理);而
【轉載】淺談HTTP中Get與Post的區別
Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資
王立平--Http中Get() 與 Post()的差別?
san gin word-wrap word add spa line 都是 保密 Http協議是基於TCP協議的,而TCP協議是一種有連接。可靠的傳輸協議。假設丟失的話,會重傳。所以這種話,就 不會有數據的丟失了。 而Http協議有三種方法。Get,Pos
99%的人都理解錯了HTTP中GET與POST的區別
tex method 無限 ext 一點 size 環境 ans 交通 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。
99%的人可能都理解錯了HTTP中GET與POST的區別
角色 ref 裏的 們的 接受 遺憾 為什麽 eth ges GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。 你可能自己寫過無數個G
淺談HTTP中Get與Post的區別(轉)
Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個
HTTP中GET與POST的區別
Get和Post是HTTP請求的兩種基本方法, GET POST Get引數包含在URL。 Post通過 request body 傳遞引數。 Get在瀏覽器回退時
Python Django 前後端資料互動 之 HTTP協議下GET與POST的區別 99%的人都理解錯了HTTP中GET與POST的區別(轉自知乎)
99%的人都理解錯了HTTP中GET與POST的區別(轉自知乎) 作者:Larry 連結:https://zhuanlan.zhihu.com/p/22536382 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授
網路程式設計之HTTP中GET與POST請求
1 參考自w3schools給出一個“標準答案” GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊; GET引數通過URL傳遞,POST放在Request body中; GET請求在URL中傳送的引數是有長度限制的,而POST沒有;
淺談HTTP中Get與Post的區別
Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增
淺談HTTP中Get與Post的區別,轉載
接觸GET/POST已經有段時日了,但對其中區別以及較深度的理解還是模凌兩可,今天在網上查閱相關資料,發現一篇另自己恍然大悟的文章,供自己學習和大家參考。 Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是
淺談HTTP中Get與Post的區別(轉)
看面試題題庫看到這個問題,百度搜到了一篇比較好的文章,就轉了過來,以下是原文。 Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路
99%的人都理解錯了HTTP中GET與POST的區別(轉自知乎)
替換 混亂 避免 產生 答案 風險 自己的 等等 性能 作者:Larry鏈接:https://zhuanlan.zhihu.com/p/22536382來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。 GET和POST是HTTP請求的兩種基本方
你真的瞭解HTTP中GET與POST的區別嗎?
最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 當你在面試中被問到這個問題,你的內心充滿了自信和喜悅。你輕輕鬆鬆的給出了一個“標準答案”: GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址可以被B
詳解HTTP中GET與POST的區別,不是你看過的標準答案!
防吐槽宣告:本文適合程式設計師新人,自認閱文無數、技術超叼的大神不用看。 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 你
HTTP 中 GET 與 POST 的區別(詳解)
我們都知道GET和POST是HTTP請求的兩種基本方法,最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 很多權威網站總結出的他們的區別: GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址可以被Bookmark,而POST不可以。
HTTP請求協議中GET和POST兩種基本請求方法的區別
GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址可以被Bookmark,而POST不可以。 GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。 GET請求只能進行url編碼
HTTP協議中GET和POST兩種基本請求方法的區別
GET和POST兩種基本請求方法的區別 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 你可能自己寫過無數個G