Http報文格式學習及Get和Post主要區別總結

HTTP(HyperText Transport Protocol,超文本傳送協議)

http請求數據包的格式:頭部(request line + header)+  數據(data)html

頭部和數據包體經過一個空行來隔開,頭部的格式主要包括請求行+請求頭部。以下圖數據庫

HTTP請求頭

請求行

請求行由請求方法字段URL字段HTTP協議版本字段3個字段組成,它們用空格分隔如:瀏覽器

GET /index.html HTTP/1.1。安全

HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這裏介紹最經常使用的GET方法和POST方法。服務器

GET方式:在URL裏面就說明要請求的資源,URL裏面包含參數,「?」後面就是參數,而「?」前面就是URL的結束。「?ip=192.168.156.11&active=on」這種就是GET方式的包,而服務器把客戶端請求的內容在數據段裏面發回給客戶端。post

POST方式:傳輸的數據不在URL裏面出現,而是在數據段裏面出現。可是請求頭部多了Content-Type和Content-Length兩個字段。編碼

請求頭部

請求頭部由(關鍵字:<空格>值)對組成,每行一對,關鍵字和值用英文冒號「:<空格>」分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭有:spa

User-Agent:產生請求的瀏覽器類型。操作系統

Accept:客戶端可識別的內容類型列表。.net

Host:請求的主機名,容許多個域名同處一個IP地址,即虛擬主機。

下面是GET包的一個例子:傳輸的數據在URL裏

再看看POST包的例子:傳輸的數據在數據段裏面

HTTP響應報文

HTTP響應也由兩個個部分組成,分別是:響應頭(狀態行+消息報頭)+響應正文

狀態行格式以下:

HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。狀態代碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

1xx:指示信息–表示請求已接收,繼續處理。

2xx:成功–表示請求已被成功接收、理解、接受。

3xx:重定向–要完成請求必須進行更進一步的操做。

4xx:客戶端錯誤–請求有語法錯誤或請求沒法實現。

5xx:服務器端錯誤–服務器未能實現合法的請求。

下面是http響應包的例子

 
Get和Post主要區別以下:

一、Get是用來從服務器上得到數據,而Post是用來向服務器上傳遞數據。
二、Get將表單中數據的按照variable=value的形式,添加到action所指向的URL後面,而且二者使用「?」鏈接,而各個變量之間使用「&」鏈接;Post是將表單中的數據放在form的數據體中,按照變量和值相對應的方式,傳遞到action所指向URL。
三、Get是不安全的,由於在傳輸過程,數據被放在請求的URL中,而現在現有的不少服務器、代理服務器或者用戶代理都會將請求URL記錄到日誌文件中,而後放在某個地方,這樣就可能會有一些隱私的信息被第三方看到。另外,用戶也能夠在瀏覽器上直接看到提交的數據,一些系統內部消息將會一同顯示在用戶面前。Post的全部操做對用戶來講都是不可見的。
四、Get傳輸的數據量小,這主要是由於受URL長度限制;而Post能夠傳輸大量的數據,因此在上傳文件只能使用Post。
五、Get限制Form表單的數據集的值必須爲ASCII字符;而Post支持整個ISO10646字符集。
六、Get是Form的默認方法。
 
 

      常見錯誤認識:

      "GET方式提交的數據最多隻能是1024字節",由於GET是經過URL提交數據,那麼GET可提交的數據量就跟URL的長度有直接關係了。而實際上,URL不存在參數上限的問題HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制。IE對URL長度的限制是2083字節(2K+35)。對於其餘瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操做系統的支持。

  注意這是限制是整個URL長度,而不只僅是你的參數值數據長度。

      理論上講,POST是沒有大小限制的HTTP協議規範也沒有進行大小限制,說「POST數據量存在80K/100K的大小限制」是不許確的,POST數據是沒有限制的,起限制做用的是服務器的處理程序的處理能力。

 

      post請求只能適合於頁面到頁面之間的轉移請求,從地址欄中直接輸入地址,發出的請求是沒法造成post請求的,post狀況下,前一個頁面的<input>域被做爲參數傳遞到服務器,get狀況下,參數依靠地址中「?」後面的字符串構成參數。而frame中src屬性指定的地址,偏偏如同從地址欄中輸入的地址同樣,發出的請求是get請求。

GET和POST兩種方法都是將數據送到服務器,但你該用哪種呢?
      HTTP標準包含這兩種方法是爲了達到不一樣的目的。POST用於建立資源,資源的內容會被編入HTTP請示的內容中。例如,處理定貨表單、在數據庫中加入新數據行等。
當請求無反作用時(如進行搜索),即可使用GET方法;當請求有反作用時(如在數據庫添加數據行),則用POST方法。一個比較實際的問題是:GET方法可能會產生很長的URL,或許會超過某些瀏覽器與服務器對URL長度的限制。


若符合下列任一狀況,則用POST方法:

  • 請求的結果有持續性的反作用,例如,數據庫內添加新的數據行。
  • 若使用GET方法,則表單上收集的數據可能讓URL過長。
  • 要傳送的數據不是採用7位的ASCII編碼。

若符合下列任一狀況,則用GET方法:   

  • 請求是爲了查找資源,HTML表單數據僅用來幫助搜索。
  • 請求結果無持續性的反作用。
  • 收集的數據及HTML表單內的輸入字段名稱的總長不超過1024個字符。

 

參考:http://blog.csdn.net/firefoxbug/article/details/7677240

         http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

相關文章
相關標籤/搜索