天天看點

3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

HTTP簡介

HTTP協定是Hyper Text Transfer Protocol(超文本傳輸協定)的縮寫,是用于從網際網路(WWW:World Wide Web )伺服器傳輸超文本到本地浏覽器的傳送協定。。

HTTP是一個基于TCP/IP通信協定來傳遞資料(HTML 檔案, 圖檔檔案, 查詢結果等)。

HTTP工作原理

HTTP三點注意事項:

  • HTTP是無連接配接:無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。
  • HTTP是媒體獨立的:這意味着,隻要用戶端和伺服器知道如何處理的資料内容,任何類型的資料都可以通過HTTP發送。用戶端以及伺服器指定使用适合的MIME-type内容類型。
  • HTTP是無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

HTTP消息結構

HTTP請求消息

一個HTTP請求封包由請求行(request line)、請求頭(header)、空行和請求資料4個部分組成,下圖給出了請求封包的一般格式。

3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

1.請求行

請求行由請求方法字段、URL字段和HTTP協定版本字段3個字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。

根據HTTP标準,HTTP請求可以使用多種請求方法。

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

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

3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

而常見的有如下幾種:

1).GET

最常見的一種請求方式,當用戶端要從伺服器中讀取文檔時,當點選網頁上的連結或者通過在浏覽器的位址欄輸入網址來浏覽網頁的,使用的都是GET方式。GET方法要求伺服器将URL定位的資源放在響應封包的資料部分,回送給用戶端。使用GET方法時,請求參數和對應的值附加在URL後面,利用一個問号(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的資料直接表示在位址中,是以我們可以把請求結果以連結的形式發送給好友。以用google搜尋domety為例,Request格式如下:

[html]  view plain  copy  

  1. GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1    
  2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,   
  3. application/msword, application/x-silverlight, application/x-shockwave-flash, **    
  4. Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>    
  5. Accept-Language: zh-cn    
  6. Accept-Encoding: gzip, deflate    
  7. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
  8. Host: <a href="http://www.google.cn">www.google.cn</a>    
  9. Connection: Keep-Alive    
  10. Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;   
  11. NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-  
  12. FxlRugatx63JLv7CWMD6UB_O_r    
  13. hl=zh-CN&source=hp&q=domety  

可以看到,POST方式請求行中不包含資料字元串,這些資料儲存在”請求内容”部分,各資料之間也是使用”&”符号隔開。POST方式大多用于頁面的表單中。因為POST也能完成GET的功能,是以多數人在設計表單的時候一律都使用POST方式,其實這是一個誤區。GET方式也有自己的特點和優勢,我們應該根據不同的情況來選擇是使用GET還是使用POST。

3).HEAD

HEAD就像GET,隻不過服務端接受到HEAD請求後隻傳回響應頭,而不會發送響應内容。當我們隻需要檢視某個頁面的狀态的時候,使用HEAD是非常高效的,因為在傳輸的過程中省去了頁面内容。

2.請求頭

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒号“:”分隔。請求頭部通知伺服器有關于用戶端請求的資訊,典型的請求頭有:

  • User-Agent:産生請求的浏覽器類型。
  • Accept:用戶端可識别的内容類型清單。
  • Host:請求的主機名,允許多個域名同處一個IP位址,即虛拟主機。

3.空行

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

4.請求資料

請求資料不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是Content-Type和Content-Length。

執行個體

1).GET

//請求首行

GET /hello/index.jsp HTTP/1.1

//請求頭資訊,因為GET請求沒有正文

Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Referer: http://localhost/hello/index.jsp

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

Content-Type: application/x-www-form-urlencoded 

Content-Length: 14 

// 這裡是空行

//POST有請求正文

username=hello

HTTP響應消息

HTTP響應也由三個部分組成,分别是:狀态行、響應頭、空行、響應正文。

正如你所見,在響應中唯一真正的差別在于第一行中用狀态資訊代替了請求資訊。狀态行(status line)通過提供一個狀态碼來說明所請求的資源情況。

狀态行格式如下:

[html]  view plain  copy  

  1. HTTP-Version    Status-Code    Reason-Phrase    CRLF  

其中,HTTP-Version表示伺服器HTTP協定的版本;

Status-Code表示伺服器發回的響應狀态代碼;

Reason-Phrase表示狀态代碼的文本描述。

3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

HTTP狀态碼

當浏覽者通路一個網頁時,浏覽者的浏覽器會向網頁所在伺服器送出請求。當浏覽器接收并顯示網頁前,此網頁所在的伺服器會傳回一個包含HTTP狀态碼的資訊頭(server header)用以響應浏覽器的請求。

HTTP狀态碼的英文為HTTP Status Code。狀态代碼由三位數字組成,第一個數字定義了響應的類别,且有五種可能取值。

  • 1xx:訓示資訊--表示請求已接收,繼續處理。
  • 2xx:成功--表示請求已被成功接收、了解、接受。
  • 3xx:重定向--要完成請求必須進行更進一步的操作。
  • 4xx:用戶端錯誤--請求有文法錯誤或請求無法實作。
  • 5xx:伺服器端錯誤--伺服器未能實作合法的請求。

常見狀态代碼、狀态描述的說明如下。

  • 200 OK:用戶端請求成功。
  • 400 Bad Request:用戶端請求有文法錯誤,不能被伺服器所了解。
  • 401 Unauthorized:請求未經授權,這個狀态代碼必須和WWW-Authenticate報頭域一起使用。
  • 403 Forbidden:伺服器收到請求,但是拒絕提供服務。
  • 404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。
  • 500 Internal Server Error:伺服器發生不可預期的錯誤。
  • 503 Server Unavailable:伺服器目前不能處理用戶端的請求,一段時間後可能恢複正常,舉個例子:HTTP/1.1 200 OK(CRLF)。
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

HTTP響應頭

3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別
3、HTTP請求頭與響應頭HTTP簡介HTTP消息結構HTTP響應消息關于HTTP請求GET和POST的差別

HTTP content-Type

Content-Type,内容類型,一般是指網頁中存在的Content-Type,用于定義網絡檔案的類型和網頁的編碼,決定浏覽器将以什麼形式、什麼編碼讀取這個檔案,這就是經常看到一些Asp網頁點選的結果卻是下載下傳到的一個檔案或一張圖檔的原因。

HTTP content-type 對照表  

關于HTTP請求GET和POST的差別

1.GET送出,請求的資料會附在URL之後(就是把資料放置在HTTP協定頭<request-line>中),以?分割URL和傳輸資料,多個參數用&連接配接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果資料是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字元串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符号以16進制表示的ASCII。

  POST送出:把送出的資料放置在是HTTP包的包體<request-body>中。上文示例中紅色字型标明的就是實際的傳輸資料

  是以,GET送出的資料會在位址欄中顯示出來,而POST送出,位址欄不會改變

2.傳輸資料的大小:

   首先聲明,HTTP協定沒有對傳輸的資料大小進行限制,HTTP協定規範也沒有對URL長度進行限制。 而在實際開發中存在的限制主要有:

   GET:特定浏覽器和伺服器對URL長度有限制,例如IE對URL長度的限制是2083位元組(2K+35)。對于其他浏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于作業系統的支援。

   是以對于GET送出時,傳輸資料就會受到URL長度的限制。

   POST:由于不是通過URL傳值,理論上資料不受限。但實際各個WEB伺服器會規定對post送出資料大小進行限制,Apache、IIS6都有各自的配置。

3.安全性:

    POST的安全性要比GET的安全性高。注意:這裡所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的Security的含義,比如:通過GET送出資料,使用者名和密碼将明文出現在URL上,因為(1)登入頁面有可能被浏覽器緩存, (2)其他人檢視浏覽器的曆史紀錄,那麼别人就可以拿到你的賬号和密碼了,

————————————————

版權聲明:本文為部落格園部落客「小綿羊~~」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://www.cnblogs.com/lauhp/p/8979393.html