總結http get和post的區別


這個問題幾乎面試的時候都會問到,是一個老生常談的話題,然而隨着不斷的學習,對於以前的認識有很多誤區,所以還是需要不斷地總結的,學而時習之,不亦說乎。

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

1.什么是http

這里只是簡單概述一下,更多詳情可以參見:

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

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM