總結http get和post的區別

有興趣關注一下個人我的公衆號,專一dotNet開發,謝謝jquery

這個問題幾乎面試的時候都會問到,是一個老生常談的話題,然而隨着不斷的學習,對於之前的認識有不少誤區,因此仍是須要不斷地總結的,學而時習之,不亦說乎。web

  1. 什麼是http?
  2. get、post常見的區別
  3. get和post不一樣點的誤區
  4. 附錄常見的http狀態碼

1.什麼是http

這裏只是簡單概述一下,更多詳情能夠參見:面試

  • 基於tcp/ip、一種網絡應用層協議、超文本傳輸協議HyperText Transfer Protocol
  • 工做方式:客戶端請求服務端應答的模式
  • 快速:無狀態鏈接,靈活:能夠傳輸任意對象,對象類型由Content-Type標記
  • 客戶端請求request消息包括如下格式:請求行(request line)、請求頭部(header)、空行、請求數據,以下圖

 服務端響應response也由四個部分組成,分別是:狀態行、消息報頭、空行、響應正文ajax

  • 請求方法,http請求可使用多種請求方法。

HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。chrome

HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。瀏覽器

序號 方法 描述
1 GET 請求指定的頁面信息,並返回實體主體。
2 HEAD 相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5 DELETE 請求服務器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。
7 OPTIONS 容許客戶端查看服務器的性能。
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷。

 

 

 

 

 

 2.get和post常見的區別

http協議最多見的兩種方法GET和POST緩存

請求緩存:GET 會被緩存,而post不會安全

收藏書籤:GET能夠,而POST不能服務器

保留瀏覽器歷史記錄:GET能夠,而POST不能網絡

用處:get經常使用於取回數據,post用於提交數據

安全性:post比get安全

請求參數:querystring 是url的一部分get、post均可以帶上。 get的querystring(僅支持urlencode編碼),post的參數是放在body(支持多種編碼)

請求參數長度限制:get請求長度最多1024kb,post對請求數據沒有限制

3.get和post誤區

針對上面常見的區別,若是面試的時候這麼說,確定是有很大的毛病,剛在學校面試的時候也曾經囫圇吞棗地這樣說過,如今想一想,真的是:

誤區一:「用處:get經常使用於取回數據,post用於提交數據」

曾聽到過這樣一種說法:get替換post來優化網站性能,雖然這種說法沒錯,也的確get常被用於取回數據,可是post也被一些ui框架使用於取回數據,好比kendo ui中的grid,就是用post來接受數據的。因此結論是get、post用途也是因地制宜。若是你有使用過kendo UI,會發現分頁、過濾、自定義的參數都包含在form data裏面。

誤區二:「請求參數長度限制:get請求長度最多1024kb,post對請求數據沒有限制」

這句話看上去實在沒毛病啊,菜鳥教程也是這樣說的啊。雖然字面意思上沒有錯誤,可是理解必定要正確。我想說的是GET方法提交的url參數數據大小沒有限制,在http協議中沒有對url長度進行限制(不只僅是querystring的長度),這個限制是特定的瀏覽器及服務器對他的限制

下面就是對各類瀏覽器和服務器的最大處理能力作一些說明.

  • IE瀏覽器對URL的最大限制爲2083個字符
  • Firefox (Browser):對於Firefox瀏覽器URL的長度限制爲65,536個字符。
  • Safari (Browser):URL最大長度限制爲 80,000個字符。
  • Opera (Browser):URL最大長度限制爲190,000個字符。
  • Google (chrome):URL最大長度限制爲8182個字符。
  • Apache (Server):能接受最大url長度爲8,192個字符。
  • Microsoft Internet Information Server(IIS):能接受最大url的長度爲16,384個字符。

因此爲了符合全部標準,url的最好很差超過最低標準的2083個字符(2k+35)。固然在作客戶端程序時,url並不展現給用戶,只是個程序調用,這時長度只收web服務器的影響了。對於中文的傳遞,一個漢字最終編碼後的字符長度是9個字符。

最多見的form表單,瀏覽器默認的form表單,默認的content-type是application/x-www-form-urlencoded,提交的數據會按照key value的方式,jquery的ajax默認的也是這種content-type。固然在post方式中添加querystring必定是能夠接收的到,可是在get方式中加body參數就不必定能成功接收到了。

誤區三:「post比get安全性要高」

這裏的安全是相對性,並非真正意義上的安全,經過get提交的數據都將顯示到url上,頁面會被瀏覽器緩存,其餘人查看歷史記錄會看到提交的數據,而post不會。另外get提交數據還可能會形成CSRF攻擊。

誤區四:「GET產生一個TCP數據包;POST產生兩個TCP數據包。」

這一點理解起來仍是有必定難度的,這個觀點來自於 99%的人都理解錯了HTTP中GET與POST的區別,反轉來自

據說『99% 的人都理解錯了 HTTP 中 GET 與 POST 的區別』??.

4.附錄常見的http狀態碼

1xx:信息
消息
描述
100 Continue
服務器僅接收到部分請求,可是一旦服務器並無拒絕該請求,客戶端應該繼續發送其他的請求。
101 Switching Protocols
服務器轉換協議:服務器將聽從客戶的請求轉換到另一種協議。

 

 

2xx:成功
消息
描述
200 OK
請求成功(其後是對GET和POST請求的應答文檔。)
201 Created
請求被建立完成,同時新的資源被建立。
202 Accepted
供處理的請求已被接受,可是處理未完成。
203 Non-authoritative Information
文檔已經正常地返回,但一些應答頭可能不正確,由於使用的是文檔的拷貝。
204 No Content
沒有新文檔。瀏覽器應該繼續顯示原來的文檔。若是用戶按期地刷新頁面,而Servlet能夠肯定用戶文檔足夠新,這個狀態代碼是頗有用的。
205 Reset Content
沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
206 Partial Content
客戶發送了一個帶有Range頭的GET請求,服務器完成了它。



 

 

 

3xx:重定向
消息
描述
300 Multiple Choices
多重選擇。連接列表。用戶能夠選擇某連接到達目的地。最多容許五個地址。
301 Moved Permanently
所請求的頁面已經轉移至新的url。
302 Found
所請求的頁面已經臨時轉移至新的url。
303 See Other
所請求的頁面可在別的url下被找到。
304 Not Modified
未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
305 Use Proxy
客戶請求的文檔應該經過Location頭所指明的代理服務器提取。
306  Unused
此代碼被用於前一版本。目前已再也不使用,可是代碼依然被保留。
307 Temporary Redirect
被請求的頁面已經臨時移至新的url。
4xx:客戶端錯誤
消息
描述
400 Bad Request
服務器未能理解請求。
401 Unauthorized
被請求的頁面須要用戶名和密碼。
401.1
登陸失敗。
401.2
服務器配置致使登陸失敗。
401.3
因爲 ACL 對資源的限制而未得到受權。
401.4
篩選器受權失敗。
401.5
ISAPI/CGI 應用程序受權失敗。
401.7
訪問被 Web 服務器上的 URL 受權策略拒絕。這個錯誤代碼爲 IIS 6.0 所專用。
402 Payment Required
此代碼尚沒法使用。
403 Forbidden
對被請求頁面的訪問被禁止。
403.1
執行訪問被禁止。
403.2
讀訪問被禁止。
403.3
寫訪問被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒絕。
403.7
要求客戶端證書。
403.8
站點訪問被拒絕。
403.9
用戶數過多。
403.10
配置無效。
403.11
密碼更改。
403.12
拒絕訪問映射表。
403.13
客戶端證書被吊銷。
403.14
拒絕目錄列表。
403.15
超出客戶端訪問許可。
403.16
客戶端證書不受信任或無效。
403.17
客戶端證書已過時或還沒有生效。
403.18
在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼爲 IIS 6.0 所專用。
403.19
不能爲這個應用程序池中的客戶端執行 CGI。這個錯誤代碼爲 IIS 6.0 所專用。
403.20
Passport 登陸失敗。這個錯誤代碼爲 IIS 6.0 所專用。
404 Not Found
服務器沒法找到被請求的頁面。
404.0
(無)–沒有找到文件或目錄。
404.1
沒法在所請求的端口上訪問 Web 站點。
404.2
Web 服務擴展鎖定策略阻止本請求。
404.3
MIME 映射策略阻止本請求。
405 Method Not Allowed
請求中指定的方法不被容許。
406 Not Acceptable
服務器生成的響應沒法被客戶端所接受。
407 Proxy Authentication Required
用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。
408 Request Timeout
請求超出了服務器的等待時間。
409 Conflict
因爲衝突,請求沒法被完成。
410 Gone
被請求的頁面不可用。
411 Length Required
"Content-Length" 未被定義。若是無此內容,服務器不會接受請求。
412 Precondition Failed
請求中的前提條件被服務器評估爲失敗。
413 Request Entity Too Large
因爲所請求的實體的太大,服務器不會接受請求。
414 Request-url Too Long
因爲url太長,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種狀況。
415 Unsupported Media Type
因爲媒介類型不被支持,服務器不會接受請求。
416 Requested Range Not Satisfiable
服務器不能知足客戶在請求中指定的Range頭。
417 Expectation Failed
執行失敗。
423
鎖定的錯誤。
5xx:服務器錯誤
消息
描述
500 Internal Server Error
請求未完成。服務器遇到不可預知的狀況。
500.12
應用程序正忙於在 Web 服務器上從新啓動。
500.13
Web 服務器太忙。
500.15
不容許直接請求 Global.asa。
500.16
UNC 受權憑據不正確。這個錯誤代碼爲 IIS 6.0 所專用。
500.18
URL 受權存儲不能打開。這個錯誤代碼爲 IIS 6.0 所專用。
500.100
內部 ASP 錯誤。
501 Not Implemented
請求未完成。服務器不支持所請求的功能。
502 Bad Gateway
請求未完成。服務器從上游服務器收到一個無效的響應。
502.1
CGI 應用程序超時。 ·
502.2
CGI 應用程序出錯。
503 Service Unavailable
請求未完成。服務器臨時過載或當機。
504 Gateway Timeout
網關超時。
505 HTTP Version Not Supported
服務器不支持請求中指明的HTTP協議版本。

 

ds

相關文章
相關標籤/搜索