1. 程式人生 > 其它 >HTTP請求/響應報文結構

HTTP請求/響應報文結構

HTTP請求/響應報文結構

HTTP請求報文

一個HTTP請求報文由四個部分組成:請求行、請求頭部、空行、請求資料。

1.請求行

請求行由請求方法欄位、URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔。比如 GET /data/info.html HTTP/1.1

方法欄位就是HTTP使用的請求方法,比如常見的GET/POST

其中HTTP協議版本有兩種:HTTP1.0/HTTP1.1 可以這樣區別:

HTTP1.0對於每個連線都只能傳送一個請求和響應,請求就會關閉,HTTP1.0沒有Host欄位;而HTTP1.1在同一個連線中可以傳送多個請求和響應,多個請求可以重疊和同時進行,HTTP1.1必須有Host欄位。

2.請求頭部

HTTP客戶程式(例如瀏覽器),向伺服器傳送請求的時候必須指明請求型別(一般是GET或者 POST)。如有必要,客戶程式還可以選擇傳送其他的請求頭。大多數請求頭並不是必需的,但Content-Length除外。對於POST請求來說 Content-Length必須出現。

常見的請求頭欄位含義:

Accept: 瀏覽器可接受的MIME型別。

Accept-Charset:瀏覽器可接受的字符集。

Accept-Encoding:瀏覽器能夠進行解碼的資料編碼方式,比如gzip。Servlet能夠向支援gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。

Accept-Language:瀏覽器所希望的語言種類,當伺服器能夠提供一種以上的語言版本時要用到。

Authorization:授權資訊,通常出現在對伺服器傳送的WWW-Authenticate頭的應答中。

Content-Length:表示請求訊息正文的長度。

Host: 客戶機通過這個頭告訴伺服器,想訪問的主機名。Host頭域指定請求資源的Intenet主機和埠號,必須表示請求url的原始伺服器或閘道器的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態碼返回。

If-Modified-Since:客戶機通過這個頭告訴伺服器,資源的快取時間。只有當所請求的內容在指定的時間後又經過修改才返回它,否則返回304“Not Modified”應答。

Referer:客戶機通過這個頭告訴伺服器,它是從哪個資源來訪問伺服器的(防盜鏈)。包含一個URL,使用者從該URL代表的頁面出發訪問當前請求的頁面。

User-Agent:User-Agent頭域的內容包含發出請求的使用者資訊。瀏覽器型別,如果Servlet返回的內容與瀏覽器型別有關則該值非常有用。

Cookie:客戶機通過這個頭可以向伺服器帶資料,這是最重要的請求頭資訊之一。

Pragma:指定“no-cache”值表示伺服器必須返回一個重新整理後的文件,即使它是代理伺服器而且已經有了頁面的本地拷貝。

From:請求傳送者的email地址,由一些特殊的Web客戶程式使用,瀏覽器不會用到它。

Connection:處理完這次請求後是否斷開連線還是繼續保持連線。如果Servlet看到這裡的值為“Keep- Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1預設進行持久連線),它就可以利用持久連線的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中傳送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小。

Range:Range頭域可以請求實體的一個或者多個子範圍。例如,

表示頭500個位元組:bytes=0-499

表示第二個500位元組:bytes=500-999

表示最後500個位元組:bytes=-500

表示500位元組以後的範圍:bytes=500-

第一個和最後一個位元組:bytes=0-0,-1

同時指定幾個範圍:bytes=500-600,601-999

但是伺服器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200 (OK)。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所傳送的非標準的請求頭,表示螢幕大小、顏色深度、作業系統和CPU型別。

3.空行

它的作用是通過一個空行,告訴伺服器請求頭部到此為止。

4.請求資料

若方法欄位是GET,則此項為空,沒有資料

若方法欄位是POST,則通常來說此處放置的就是要提交的資料

比如要使用POST方法提交一個表單,其中有user欄位中資料為“admin”, password欄位為123456,那麼這裡的請求資料就是 user=admin&password=123456,使用&來連線各個欄位。

總的來說,HTTP請求報文格式就如下圖所示



這裡寫圖片描述





這裡寫圖片描述



上面是POST方法,它的請求行URL段中一般是沒有引數的,引數放在了報文體中。而GET方法的引數直接置於請求行URL中,報文體則為空。

HTTP響應報文

同樣的,HTTP響應報文也由三部分組成:響應行、響應頭、響應體

1.響應行

響應行一般由協議版本、狀態碼及其描述組成 比如 HTTP/1.1 200 OK

其中協議版本HTTP/1.1或者HTTP/1.0,200就是它的狀態碼,OK則為它的描述。

//常見狀態碼:

100~199:表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程。

200~299:表示成功接收請求並已完成整個處理過程。常用200

300~399:為完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、常用302(意味著你請求我,我讓你去找別人),307和304(我不給你這個資源,自己拿快取)

400~499:客戶端的請求有錯誤,常用404(意味著你請求的資源在web伺服器中沒有)403(伺服器拒絕訪問,許可權不夠)

500~599:伺服器端出現錯誤,常用500

更詳細的狀態碼資訊

2.響應頭

響應頭用於描述伺服器的基本資訊,以及資料的描述,伺服器通過這些資料的描述資訊,可以通知客戶端如何處理等一會兒它回送的資料。

設定HTTP響應頭往往和狀態碼結合起來。例如,有好幾個表示“文件位置已經改變”的狀態程式碼都伴隨著一個Location頭,而401(Unauthorized)狀態程式碼則必須伴隨一個WWW-Authenticate頭。然而,即使在沒有設定特殊含義的狀態程式碼時,指定應答頭也是很有用的。應答頭可以用來完成:設定Cookie,指定修改日期,指示瀏覽器按照指定的間隔重新整理頁面,宣告文件的長度以便利用持久HTTP連線,……等等許多其他任務。

常見的響應頭欄位含義:

Allow:伺服器支援哪些請求方法(如GET、POST等)。

Content-Encoding:文件的編碼(Encode)方法。只有在解碼之後才可以得到Content-Type頭指定的內容型別。利用gzip壓縮文件能夠顯著地減少HTML文件的下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE4、IE5才支援它。因此,Servlet應該通過檢視Accept-Encoding頭(即request.getHeader(“Accept- Encoding”))檢查瀏覽器是否支援gzip,為支援gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。

Content-Length:表示內容長度。只有當瀏覽器使用持久HTTP連線時才需要這個資料。如果你想要利用持久連線的優勢,可以把輸出文件寫入 ByteArrayOutputStram,完成後檢視其大小,然後把該值放入Content-Length頭,最後通過byteArrayStream.writeTo(response.getOutputStream()傳送內容。

Content- Type:表示後面的文件屬於什麼MIME型別。Servlet預設為text/plain,但通常需要顯式地指定為text/html。由於經常要設定 Content-Type,因此HttpServletResponse提供了一個專用的方法setContentType。

Date:當前的GMT時間,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,需要知道使用者所在的時區。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩。

Expires:告訴瀏覽器把回送的資源快取多長時間,-1或0則是不快取。

Last-Modified:文件的最後改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲於指定時間的文件才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設定。

Location:這個頭配合302狀態碼使用,用於重定向接收者到一個新URI地址。表示客戶應當到哪裡去提取文件。Location通常不是直接設定的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設定狀態程式碼為302。

Refresh:告訴瀏覽器隔多久重新整理一次,以秒計。

Server:伺服器通過這個頭告訴瀏覽器伺服器的型別。Server響應頭包含處理請求的原始伺服器的軟體資訊。此域能包含多個產品標識和註釋,產品標識一般按照重要性排序。Servlet一般不設定這個值,而是由Web伺服器自己設定。

Set-Cookie:設定和頁面關聯的Cookie。Servlet不應使用response.setHeader(“Set-Cookie”, …),而是應使用HttpServletResponse提供的專用方法addCookie。

Transfer-Encoding:告訴瀏覽器資料的傳送格式。

WWW-Authenticate:客戶應該在Authorization頭中提供什麼型別的授權資訊?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)。注意Servlet一般不進行這方面的處理,而是讓Web伺服器的專門機制來控制受密碼保護頁面的訪問。

注:設定應答頭最常用的方法是HttpServletResponse的setHeader,該方法有兩個引數,分別表示應答頭的名字和值。和設定狀態程式碼相似,設定應答頭應該在傳送任何文件內容之前進行。

setDateHeader方法和setIntHeadr方法專門用來設定包含日期和整數值的應答頭,前者避免了把Java時間轉換為GMT時間字串的麻煩,後者則避免了把整數轉換為字串的麻煩。

HttpServletResponse還提供了許多設定

setContentType:設定Content-Type頭。大多數Servlet都要用到這個方法。

setContentLength:設定Content-Length頭。對於支援持久HTTP連線的瀏覽器來說,這個函式是很有用的。

addCookie:設定一個Cookie(Servlet API中沒有setCookie方法,因為應答往往包含多個Set-Cookie頭)。

3.響應體

響應體就是響應的訊息體,如果是純資料就是返回純資料,如果請求的是HTML頁面,那麼返回的就是HTML程式碼,如果是JS就是JS程式碼,如此之類。

HTTP響應報文格式就如下圖所示



這裡寫圖片描述



通用頭、實體頭

HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。前面講解了請求頭和響應頭,接下來看看通用頭和實體頭(這裡可能和前面介紹的請求頭、響應頭有重複)。

(1)通用頭域

通用頭域包含請求和響應訊息都支援的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴充套件要求通訊雙方都支援此擴充套件,如果存在不支援的通用頭域,一般將會作為實體頭域處理。下面簡單介紹幾個通用頭域。

常見通用頭含義:

Cache-Control:指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定 Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,響應訊息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各個訊息中的指令含義如下:

Public指示響應可被任何快取區快取。 Private指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的部分響應訊息,此響應訊息對於其他使用者的請求無效。 no-cache指示請求或響應訊息不能快取 no-store用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。 max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。 min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。 max-stale指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出超時期指定值之內的響應訊息。

Date:表示訊息傳送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,需要知道使用者所在的時區。

Pragma:用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。

(2)實體頭域

請求訊息和響應訊息都可以包含實體資訊,實體資訊一般由實體頭域和實體組成。實體頭域包含關於實體的原資訊,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體頭,但是這些域可能無法未接受方識別。實體可以是一個經過編碼的位元組流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。

常見實體頭含義:

Content-Encoding: 伺服器通過這個頭告訴瀏覽器資料的壓縮格式。

Content-Length: 伺服器通過這個頭告訴瀏覽器回送資料的長度。

Content-Disposition:告訴瀏覽器以下載方式開啟資料。

Content-Type:伺服器通過這個頭告訴瀏覽器回送資料的型別。Content-Type實體頭用於向接收方指示實體的介質型別,指定HEAD方法送到接收方的實體介質型別,或GET方法傳送的請求介質型別。

Content-Range:用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在伺服器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。一般格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth

例如,傳送頭500個位元組次欄位的形式:Content-Range:bytes0- 499/1234,如果一個http訊息包含此節(例如,對範圍請求的響應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍, Content-Length表示實際傳送的位元組數。

Last-Modified:指定伺服器上儲存內容的最後修訂時間。

ETag:快取相關的頭

Expires:告訴瀏覽器把回送的資源快取多長時間 -1或0則是不快取

其中三種禁止瀏覽器快取的頭欄位:

Expires:-1或0

Cache-Control:no-cache

Pragma:no-cache

GET、POST區別

Http定義了與伺服器互動的不同方法,最基本的方法有4種:GET、POST、PUT、DELETE。

而HTTP中的 GET,POST,PUT,DELETE 就對應著對URL資源的 查,改,增,刪 4個操作。所以說:GET一般用於獲取/查詢資源資訊,而POST一般用於更新資源資訊。

主要區分一下get和post

1.提交資料的形式:

GET請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),會直接展現在位址列中,以?分割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方法則會把資料放到請求資料欄位中以&分隔各個欄位,請求行不包含資料引數,位址列也不會額外附帶引數

2.提交資料的大小

get方法提交資料的大小直接影響到了URL的長度,但HTTP協議規範中其實是沒有對URL限制長度的,限制URL長度的是客戶端或伺服器的支援的不同所影響:比如IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。

post方式HTTP協議規範中也沒有限定,起限制作用的是伺服器的處理程式的處理能力。

所以大小的限制還是得受各個web伺服器配置的不同而影響。

3.提交資料的安全

POST比GET方式的安全性要高

通過GET提交資料,使用者名稱和密碼將明文出現在URL上,因為一下幾個原因get方式安全性會比post弱:

(1)登入頁面有可能被瀏覽器快取

(2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可 以拿到你的賬號和密碼了

(3)當遇上跨站的攻擊時,安全性的表現更差了
————————————————
版權宣告:本文為CSDN博主「守望_shouwang」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/shouwang666666/article/details/70232053/