HTTP協議的學習

2021-06-20 19:42:02 字數 4148 閱讀 7334

1.http報文格式

http報文是面向文字的,報文中的每乙個欄位都是一些ascii碼串,各個欄位的長度是不確定的。http有兩類報文:請求報文和響應報文。

請求報文

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

(1)請求行

請求行由請求方法字段、url欄位和http協議版本欄位3個字段組成,它們用空格分隔。例如,get /index.html http/1.1。

http協議的請求方法有get、post、head、put、delete、options、trace、connect。這裡介紹最常用的get方法和post方法。

get:當客戶端要從伺服器中讀取文件時,使用get方法。get方法要求伺服器將url定位的資源放在響應報文的資料部分,回送給客戶端。使用get方法時,請求引數和對應的值附加在url後面,利用乙個問號(「?」)代表url的結尾與請求引數的開始,傳遞引數長度受限制。例如,/index.jsp?id=100&op=bind。

post:當客戶端給伺服器提供資訊較多時可以使用post方法。post方法將請求引數封裝在http請求資料中,以名稱/值的形式出現,可以傳輸大量資料,可用來傳送檔案。

(2)請求頭部

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

user-agent:產生請求的瀏覽器型別。

accept:客戶端可識別的內容型別列表。

host:請求的主機名,允許多個網域名稱同處乙個ip位址,即虛擬主機。

(3)空行

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

對於乙個完整的http請求來說空行是必須的,否則伺服器會認為本次請求的資料尚未完全傳送到伺服器,處於等待狀態。

(4)請求資料

請求資料不在get方法中使用,而是在post方法中使用。post方法適用於需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是content-type和content-length。

(5)請求示例

post:

post報文頭如下:

一、這兩者傳遞引數時所用的編碼不一定是一樣的。在 tomcat 中似乎 get 的編碼方式是根

據頁面中指定的編碼方式,而 post 則是一直使用同一種編碼方式,可在 tomcat 的

server.xml 中配置。

二、使用 get 的時候,引數會顯示在位址列上,而 post 不會。

所以,如果這些資料是中文資料而且是非敏感資料,那麼使用 get;如果使用者輸入的資料不是

中文字元而且包含敏感資料,那麼還是使用 post為好。

表單提交中get和post方式的區別歸納如下幾點:

1. get是從伺服器上獲取資料,post是向伺服器傳送資料。

2. get是把引數資料佇列加到提交表單的action屬性所指的url中,值和表單內各個字段

一一對應,在url中可以看到。post是通過http post機制,將表單內各個字段與其內容放

置在html header內一起傳送到action屬性所指的url位址。使用者看不到這個過程。

3. 對於get方式,伺服器端用request.querystring獲取變數的值,對於post方式,服

務器端用request.form獲取提交的資料。

4. get傳送的資料量較小,不能大於2kb。post傳送的資料量較大,一般被預設為不受限制。

但理論上,iis4中最大量為80kb,iis5中為100kb。

5. get安全性非常低,post安全性較高。

在form提交的時候,如果不指定method,則預設為get請求(.net預設是post),form

中提交的資料將會附加在url之後,以?分開與url分開。字母數字字元原樣傳送,但空格轉

換為「+「號,其它符號轉換為%xx,其中xx為該符號以16進製表示的ascii(或iso latin-1)

值。get請求請提交的資料放置在http請求協議頭中,而post提交的資料則放在實體資料中;

get方式提交的資料最多只能有1024位元組,而post則沒有此限制 。post傳遞的引數在doc

裡,也就http協議所傳遞的文字,接受時再解析引數部分。獲得引數。一般用post比較好。

post提交資料是隱式的,get是通過在url裡面傳遞的,用來傳遞一些不需要保密的資料,

get是通過在url裡傳遞引數,post不是。

注:所謂安全的意味著該操作用於獲取資訊而非修改資訊。冪等的意味著對同一

url 

的多個請求應該返回同樣的結果。完整的定義並不像看起來那樣嚴格。換句話說,

get 

請求一般不應產生***。從根本上講,其目標是當使用者開啟乙個鏈結時,她可以確信從自身的角度來看沒有改變資源。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。反之亦然。

post 

請求就不那麼輕鬆了。

post 

表示可能改變伺服器上的資源的請求。仍然以新聞站點為例,讀者對文章的註解應該通過

post 

請求實現,因為在註解提交之後站點已經不同了(比方說文章下面出現一條註解)。

下面舉乙個簡單的例子來說明它們的區別:

分別通過

get和

post

方式提交表單

--> 

"" then %> 

通過get

方式傳遞的字串是:

""

"" then %> 

通過post

方式傳遞的字串是:

""

3.http請求訊息例子

下面是乙個典型的http請求訊息:

get /somedir/page.html http/1.1 //請求行(request line)

host:www.yesky.com //頭部行(header)

connection:close

user-agent:mozilla/4.0

accept-language:zh-cn

(額外的回車符和換行符)

仔細檢查這個簡單的請求訊息,我們可從中學到不少東西。首先,這個訊息是用普通的

ascii文字書寫的。其次,這個訊息共有5行(每行以乙個回車符和乙個換行符結束),最後一

行後面還有額外的乙個回車特和換行符。當然,乙個請求訊息可以不止這麼多行,也可以僅僅只

有一行。該請求訊息的第一行稱為請求行(request line),後續各行都稱為頭部行(header)。

請求行有3個寧段:方法字段、url欄位、http版本宇段。方法欄位有若干個值可供選擇,包

括get、post和head。http請求訊息絕大多數使用get方法,這是瀏覽器用來請求物件的

方法,所請求的物件就在url欄位中標識。本例表明瀏覽器在請求物件/somedir/page.html。

版本欄位是不言自明的;本例中瀏覽器實現的是http/1.1版本。

現在看一下本例中的各個頭部行。頭部行host:www.yesky.com定存放所請求物件的主

機。請求訊息中包含頭部connection:close是在告知伺服器本瀏覽器不想使用持久連線;服

務器發出所請求的物件後應關閉連線。儘管產生這個請求訊息的瀏覽器實現的是http/1.1版

本,它還是不想使用持久連線。user-agent頭部行指定使用者**,也就是產生當前請求的瀏

覽器的型別。本例的使用者**是mozilla/4.0,它是nelscape瀏覽器的乙個版本。這個頭

部行很有用,因為伺服器實際上可以給不同型別的使用者**傳送同乙個物件的不同版本(這些不

同版本位用同乙個url定址)。最後,accept-languag:頭部行指出要是所請求物件有簡體中

文版本,那麼使用者寧願接收這個版本;如果沒有這個語言版本,那麼伺服器應該傳送其預設版本。

accept-languag:僅僅是http的眾多內容協商頭部之一。

HTTP協議學習

1 什麼是http協議?http是超文字傳輸協議,是基於tcp ip協議之上實現的用於客戶端和伺服器之間資料傳輸的一種協議 2 什麼是http協議的無狀態?怎麼解決http協議的無狀態?解決 使用cookie或者session來保持會話 3 http支援的方法有哪些?一共有8種請求方法 get 獲取...

HTTP協議學習

面試過程中又乙個常見的問題,http協議,因為做伺服器開發如果用http協議的話,現在各種開源軟體都封裝好了,python中只需要簡單的繼承定義好的類,重寫get或者post等方法,幾行 就可以搭建起來乙個簡單的http伺服器,導致底層對程式設計師來說都是透明的了。但是面試中追求這個底層的問題還不少...

HTTP 協議學習

摘自 http簡介 http,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網 www world wide web 伺服器傳輸超文字到本地瀏覽器的傳送協議。http是乙個基於tcp ip通訊協議來傳遞資料 過程 http協議工作於客戶端 服務端架構為上。...