日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

網絡編程——Http請求方式Get與Post

作者:邊緣計算機 更新時間: 2022-04-12 編程語言

請求報文

請求行?
請求行由方法字段、URL 字段 和HTTP 協議版本字段 3 個部分組成,使用空格隔開。

常用的 HTTP 請求方法有 GET、POST。

GET

當客戶端要從服務器中讀取某個資源時,使用GET 方法。
GET 方法要求服務器將URL 定位的資源放在響應報文的數據部分,回送給客戶端,即向服務器請求某個資源。
使用GET方法時,請求參數和對應的值附加在 URL 后面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始,傳遞參數長度受限制,因此GET方法不適合用于上傳數據。
通過GET方法來獲取網頁時,參數會顯示在瀏覽器地址欄上,因此保密性很差。

get請求報文例子:


GET / HTTP/1.1
Host: 192.168.110.10:9000
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive



POST

當客戶端給服務器提供信息較多時可以使用POST 方法,POST 方法向服務器提交數據,
比如完成表單數據的提交,將數據提交給服務器處理。

GET 用于獲取/查詢資源信息。POST 附帶用戶數據,一般用于更新資源信息。
?

POST 方法將請求參數封裝在HTTP 請求數據中,而且長度沒有限制,因為POST攜帶的數據,在HTTP的請求正文中,以名稱/值的形式出現,可以傳輸大量數據。


POST /search HTTP/1.1 ?
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */* ?
Referer: http://www.baidu.cn
Accept-Language: zh-cn ?
Accept-Encoding: gzip, deflate ?
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) ?
Host:www.baidu.com
Connection: Keep-Alive ?
Cookie: PREF=ID=8tret43be9ae3c:U=treydfhgf5r4e65564td:NW=1:TM=5343434:?hl=zh-CN&source=hp&q=domety?


請求頭部為請求報文添加了一些附加信息,由“名/值”對組成,每行一對,名和值之間使用冒號分隔。
請求頭部通知服務器有關于客戶端請求的信息,典型的請求頭有:

請求頭?? ?含義
User-Agent? ? ? ? ? ? ? ?請求的瀏覽器類型
Accept? ? ? ? ? ? ? ? ? ? ? 客戶端可識別的響應內容類型列表,星號“ * ”用于按范圍將類型分組,用“ / ”指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型
Accept-Language? ? ?客戶端可接受的自然語言
Accept-Encoding? ? ? 客戶端可接受的編碼壓縮格式
Accept-Charset? ? ? ? 可接受的應答的字符集
Host? ? ? ? ? ? ? ? ? ? ? ? ?請求的主機名,允許多個域名同處一個IP 地址,即虛擬主機
Connection? ? ? ? ? ? ??連接方式(close或keepalive)
Cookie? ? ? ? ? ? ? ? ? ? ?存儲于客戶端擴展字段,向同一域名的服務端發送屬于該域的cookie


空行?
最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。

請求包體?body
請求包體不在GET方法中使用,而是POST方法中使用。?
POST方法適用于需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型Content-Type和包體長度Content-Length。

?

Get和Post的區別

GET請求的參數在URL里,通過URL傳遞,傳送的參數是有長度限制的;而POST的參數不在URL里,參數放在放在Request body中,長度不受限制。

GET請求的參數直接暴露在URL上,所以不能用來傳遞敏感的參數信息,比如密碼。

GET請求的URL,包括參數等信息,會被完整保留在瀏覽器歷史記錄里,而POST中的參數在body中不會被保留。

GET請求只能進行url編碼,而POST支持多種編碼方式。

GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。

GET產生的URL地址可以被Bookmark,而POST不可以。

GET在瀏覽器回退時是無害的,而POST會再次提交請求。

?

GET和POST本質上沒有區別

HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,GET/POST都是TCP連接。

GET和POST能做的事情是一樣的。如果要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。?HTTP協議沒有要求,POST的參數一定要放到請求體body里面,GET的參數就一定要放到URL里面。而是由各種瀏覽器軟件的實現,變成了現在的現象,GET要用URL傳參,POST用body傳參。當然,可以給GET加上request body,給POST帶上url參數,讓人覺得不規范。雖然GET可以帶request body,但不能保證一定能被服務器接收。不同服務器的處理方式是不同的,有些服務器會讀出數據,有些服務器直接忽略。

HTTP規定,當發起GET請求的時候,要在請求頭設置method為GET,而且要求把傳送的數據放在url中,以方便記錄。
發起POST請求,要在請求頭設置method為POST。

?

請求頭和請求體都沒有長度的要求

HTTP協議明確了,請求頭和請求體都沒有長度的要求。

而對URL長度上的限制,是別的兩個的原因造成的:

大多數瀏覽器會限制url長度在2K個字節,而大多數服務器最多處理64K大小的url。

1、瀏覽器

超過的部分不處理。據說IE對URL長度會限制在2048個字符內。但是就我所知,firefox是支持10W以上的長度。

2、服務器

服務器處理超長的URL,就是一種負擔。

因此,多數服務器出于安全、穩定等多方面的考慮,會給URL長度加限制。但是這個限制是針對所有HTTP請求的,與GET、POST沒有關系。

?

?

GET和POST的重大區別

GET產生一個TCP數據包;POST產生兩個TCP數據包。

  • 對于Get請求,瀏覽器會把GET請求的header和data一起發送出去,服務器響應返回數據;
  • 對于POST請求, 瀏覽器先發送請求header,服務器響應100 continue,瀏覽器再發送請求data,服務器響應返回完整的數據。

實際上,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差微乎其微,可以忽略。而在網絡環境差的情況下,發送兩次包的TCP,在驗證數據包完整性上,有非常大的優點。

100 Continue:服務器僅接收到部分請求,但是一旦服務器并沒有拒絕該請求,客戶端應該繼續發送其余的請求。

服務器第一次返回的?100 continue header報文,是由客戶端對http的post和get的請求策略決定的,目的是為了避免浪費資源,節省帶寬,數據傳輸消耗的時間等。只是客戶端的post請求會在發送header的時候添加expect 100去探探路,如果失敗了就不用繼續發送data,從而減少了資源的浪費。所以是否在發送一個包取決了客戶端的實現策略,和get/post并沒有關系。有的客戶端瀏覽器fireFox就只發送一個包。

?

Get和Post請求的本質上都是建立TCP連接,而無差別。

只是由于HTTP的規定和瀏覽器、服務器的限制,導致他們在應用過程中表現出一些不同。

?

?

?

原文鏈接:https://blog.csdn.net/panjunnn/article/details/108668745

欄目分類
最近更新