HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。。
HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。
Http工作原理
HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求。
Web服務(wù)器有:Apache服務(wù)器,IIS服務(wù)器(Internet Information Services)等。
Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。
HTTP默認(rèn)端口號為80,但是你也可以改為8080或者其他端口。
HTTP三點(diǎn)注意事項(xiàng):
? HTTP是無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
? HTTP是媒體獨(dú)立的:這意味著,只要客戶端和服務(wù)器知道如何處理的數(shù)據(jù)內(nèi)容,任何類型的數(shù)據(jù)都可以通過HTTP發(fā)送??蛻舳艘约胺?wù)器指定使用適合的MIME-type內(nèi)容類型。(詳見下面介紹:HTTP content-Type )
? HTTP是無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。

CGI(Common Gateway Interface) 是 HTTP
服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。 絕大多數(shù)的 CGI
程序被用來解釋處理來自表單的輸入信息,并在服務(wù)器產(chǎn)生相應(yīng)的處理,或?qū)⑾鄳?yīng)的信息反饋給瀏覽器。CGI 程序使網(wǎng)頁具有交互功能。瀏覽器顯示的內(nèi)容都有 HTML、XML、GIF、Flash 等,瀏覽器是通過 MIME Type 區(qū)分它們,決定用什么內(nèi)容什么形式來顯示。
注釋:MIME Type 是該資源的媒體類型,MIME Type 不是個(gè)人指定的,是經(jīng)過互聯(lián)網(wǎng)(IETF)組織協(xié)商,以
RFC(是一系列以編號排定的文件,幾乎所有的互聯(lián)網(wǎng)標(biāo)準(zhǔn)都有收錄在其中) 的形式作為建議的標(biāo)準(zhǔn)發(fā)布在網(wǎng)上的,大多數(shù)的 Web
服務(wù)器和用戶代理都會(huì)支持這個(gè)規(guī)范 (順便說一句,Email 附件的類型也是通過 MIME Type 指定的)。 媒體類型通常通過 HTTP
協(xié)議,由 Web 服務(wù)器告知瀏覽器的,更準(zhǔn)確地說,是通過 Content-Type
來表示的。例如:Content-Type:text/HTML。 通常只有一些卓哉互聯(lián)網(wǎng)上獲得廣泛應(yīng)用的格式才會(huì)獲得一個(gè) MIME
Type,如果是某個(gè)客戶端自己定義的格式,一般只能以 application/x- 開頭。
HTTP 消息結(jié)構(gòu)
HTTP是基于客戶端/服務(wù)端(C/S)的架構(gòu)模型,通過一個(gè)可靠的鏈接來交換信息,是一個(gè)無狀態(tài)的請求/響應(yīng)協(xié)議。
一個(gè)HTTP"客戶端"是一個(gè)應(yīng)用程序(Web瀏覽器或其他任何客戶端),通過連接到服務(wù)器達(dá)到向服務(wù)器發(fā)送一個(gè)或多個(gè)HTTP的請求的目的。
一個(gè)HTTP"服務(wù)器"同樣也是一個(gè)應(yīng)用程序(通常是一個(gè)Web服務(wù),如Apache Web服務(wù)器或IIS服務(wù)器等),通過接收客戶端的請求并向客戶端發(fā)送HTTP響應(yīng)數(shù)據(jù)。
HTTP使用統(tǒng)一資源標(biāo)識符(Uniform Resource Identifiers, URI)來傳輸數(shù)據(jù)和建立連接。
一旦建立連接后,數(shù)據(jù)消息就通過類似Internet郵件所使用的格式[RFC5322]和多用途Internet郵件擴(kuò)展(MIME)[RFC2045]來傳送。
客戶端請求消息
一個(gè)HTTP請求報(bào)文由請求行(request line)、請求頭(header)、空行和請求數(shù)據(jù)4個(gè)部分組成,下圖給出了請求報(bào)文的一般格式。

請求行
請求行由請求方法字段、URL字段和HTTP協(xié)議版本字段3個(gè)字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。
根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
? HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
? HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP 協(xié)議的 8 種請求類型介紹
HTTP 協(xié)議中共定義了八種方法或者叫“動(dòng)作”來表明對 Request-URI 指定的資源的不同操作方式,具體介紹如下:
- OPTIONS:返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性。
- HEAD:向服務(wù)器索要與GET請求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。
- GET:向特定的資源發(fā)出請求。
- POST:向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會(huì)導(dǎo)致新的資源的創(chuàng)建和/或已有資源的修改。
- PUT:向指定資源位置上傳其最新內(nèi)容。
- DELETE:請求服務(wù)器刪除 Request-URI 所標(biāo)識的資源。
- TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷。
-
CONNECT:HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
雖然 HTTP 的請求方式有 8 種,但是我們在實(shí)際應(yīng)用中常用的也就是 get 和 post,其他請求方式也都可以通過這兩種方式間接的來實(shí)現(xiàn)。
1).GET
最常見的一種請求方式,當(dāng)客戶端要從服務(wù)器中讀取文檔時(shí),當(dāng)點(diǎn)擊網(wǎng)頁上的鏈接或者通過在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁的,使用的都是GET方式。GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端。使用GET方法時(shí),請求參數(shù)和對應(yīng)的值附加在URL后面,利用一個(gè)問號(“?”)代表URL的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制。例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的數(shù)據(jù)直接表示在地址中,所以我們可以把請求結(jié)果以鏈接的形式發(fā)送給好友。以用google搜索domety為例,Request格式如下:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= 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: <a >http://www.google.cn/</a>
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: <a >www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r
可以看到,GET方式的請求一般不包含”請求內(nèi)容”部分,請求數(shù)據(jù)以地址的形式表現(xiàn)在請求行。地址鏈接如下:
<a >http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=</a>
地址中”?”之后的部分就是通過GET發(fā)送的請求數(shù)據(jù),我們可以在地址欄中清楚的看到,各個(gè)數(shù)據(jù)之間用”&”符號隔開。顯然,這種方式不適合傳送私密數(shù)據(jù)。另外,由于不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個(gè)字符,所以如果需要傳送大量數(shù)據(jù)的時(shí)候,也不適合使用GET方式。
2).POST
對于上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因?yàn)槭褂肞OST方法可以允許客戶端給服務(wù)器提供信息較多。POST方法將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù),這樣POST方式對傳送的數(shù)據(jù)大小沒有限制,而且也不會(huì)顯示在URL中。還以上面的搜索domety為例,如果使用POST方式的話,格式如下:
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: <a >http://www.google.cn/</a>
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: <a >www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_rhl=zh-CN&source=hp&q=domety
可以看到,POST方式請求行中不包含數(shù)據(jù)字符串,這些數(shù)據(jù)保存在”請求內(nèi)容”部分,各數(shù)據(jù)之間也是使用”&”符號隔開。POST方式大多用于頁面的表單中。因?yàn)镻OST也能完成GET的功能,因此多數(shù)人在設(shè)計(jì)表單的時(shí)候一律都使用POST方式,其實(shí)這是一個(gè)誤區(qū)。GET方式也有自己的特點(diǎn)和優(yōu)勢,我們應(yīng)該根據(jù)不同的情況來選擇是使用GET還是使用POST。
3).HEAD
HEAD就像GET,只不過服務(wù)端接受到HEAD請求后只返回響應(yīng)頭,而不會(huì)發(fā)送響應(yīng)內(nèi)容。當(dāng)我們只需要查看某個(gè)頁面的狀態(tài)的時(shí)候,使用HEAD是非常高效的,因?yàn)樵趥鬏數(shù)倪^程中省去了頁面內(nèi)容。
請求頭
請求頭部由關(guān)鍵字/值對組成,每行一對,關(guān)鍵字和值用英文冒號“:”分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息,典型的請求頭有:
? User-Agent:產(chǎn)生請求的瀏覽器類型。
? Accept:客戶端可識別的內(nèi)容類型列表。
? Host:請求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址,即虛擬主機(jī)。
空行
最后一個(gè)請求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭。
請求數(shù)據(jù)
請求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合。與請求數(shù)據(jù)相關(guān)的最常使用的請求頭是Content-Type和Content-Length。
示例
1).GET
//請求首行
GET /hello/index.jsp HTTP/1.1
//請求頭信息,因?yàn)镚ET請求沒有正文
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
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
//空行
//因?yàn)镚ET沒有正文,所以下面為空
2).POST
// 請求首行
POST /hello/index.jsp HTTP/1.1
//請求頭信息
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
服務(wù)器響應(yīng)消息
HTTP響應(yīng)由三個(gè)部分組成,分別是:狀態(tài)行、響應(yīng)頭、空行、響應(yīng)正文。
正如你所見,在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息。狀態(tài)行(status line)通過提供一個(gè)狀態(tài)碼來說明所請求的資源情況。
狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;
Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;
Reason-Phrase表示狀態(tài)代碼的文本描述。
HTTP狀態(tài)碼
當(dāng)瀏覽者訪問一個(gè)網(wǎng)頁時(shí),瀏覽者的瀏覽器會(huì)向網(wǎng)頁所在服務(wù)器發(fā)出請求。當(dāng)瀏覽器接收并顯示網(wǎng)頁前,此網(wǎng)頁所在的服務(wù)器會(huì)返回一個(gè)包含HTTP狀態(tài)碼的信息頭(server header)用以響應(yīng)瀏覽器的請求。
HTTP狀態(tài)碼的英文為HTTP Status Code。狀態(tài)代碼由三個(gè)十進(jìn)制數(shù)字組成,第一個(gè)十進(jìn)制數(shù)字定義了狀態(tài)碼的類型,后兩個(gè)數(shù)字沒有分類的作用,且有五種可能取值。
? 1xx:指示信息--表示請求已接收,繼續(xù)處理。
? 2xx:成功--表示請求已被成功接收、理解、接受。
? 3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。
? 4xx:客戶端錯(cuò)誤--請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)。
? 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請求。
常見狀態(tài)代碼、狀態(tài)描述的說明如下
? 200 OK:客戶端請求成功。
? 400 Bad Request:客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解。
? 401 Unauthorized:請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用。
? 403Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)。
? 404 Not Found:請求資源不存在,舉個(gè)例子:輸入了錯(cuò)誤的URL。
? 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。
? 503 ServerUnavailable:服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常,舉個(gè)例子:HTTP/1.1 200 OK(CRLF)。
HTTP狀態(tài)碼列表:
| 狀態(tài)碼 | 狀態(tài)碼英文名稱 | 中文描述 | |
|---|---|---|---|
| 100 | Continue | 繼續(xù),客戶端應(yīng)繼續(xù)其請求 | |
| 101 | Switching Protocols | 切換協(xié)議。服務(wù)器根據(jù)客戶端的請求切換協(xié)議。只能切換到更高級的協(xié)議,例如,切換到HTTP的新版本協(xié)議 | |
| 200 | OK | 請求成功。一般用于GET與POST請求 | |
| 201 | Created | 已創(chuàng)建。成功請求并創(chuàng)建了新的資源 | |
| 202 | Accepted | 已接受。已經(jīng)接受請求,但未處理完成 | |
| 203 | Non-Authoritative Information | 非授權(quán)信息。請求成功。但返回的meta信息不在原始的服務(wù)器,而是一個(gè)副本 | |
| 204 | No Content | 無內(nèi)容。服務(wù)器成功處理,但未返回內(nèi)容。在未更新網(wǎng)頁的情況下,可確保瀏覽器繼續(xù)顯示當(dāng)前文檔 | |
| 205 | Reset Content | 重置內(nèi)容。服務(wù)器處理成功,用戶終端(例如:瀏覽器)應(yīng)重置文檔視圖??赏ㄟ^此返回碼清除瀏覽器的表單域 | |
| 206 | Partial Content | 部分內(nèi)容。服務(wù)器成功處理了部分GET請求 | |
| 300 | Multiple Choices | 多種選擇。請求的資源可包括多個(gè)位置,相應(yīng)可返回一個(gè)資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 | |
| 301 | Moved Permanently | 永久移動(dòng)。請求的資源已被永久的移動(dòng)到新URI,返回信息會(huì)包括新的URI,瀏覽器會(huì)自動(dòng)定向到新URI。今后任何新的請求都應(yīng)使用新的URI代替 | |
| 302 | Found | 臨時(shí)移動(dòng)。與301類似。但資源只是臨時(shí)被移動(dòng)??蛻舳藨?yīng)繼續(xù)使用原有URI | |
| 303 | See Other | 查看其它地址。與301類似。使用GET和POST請求查看 | |
| 304 | Not Modified | 未修改。所請求的資源未修改,服務(wù)器返回此狀態(tài)碼時(shí),不會(huì)返回任何資源??蛻舳送ǔ?huì)緩存訪問過的資源,通過提供一個(gè)頭信息指出客戶端希望只返回在指定日期之后修改的資源 | |
| 305 | Use Proxy | 使用代理。所請求的資源必須通過代理訪問 | |
| 306 | Unused | 已經(jīng)被廢棄的HTTP狀態(tài)碼 | |
| 307 | Temporary Redirect | 臨時(shí)重定向。與302類似。使用GET請求重定向 | |
| 400 | Bad Request | 客戶端請求的語法錯(cuò)誤,服務(wù)器無法理解 | |
| 401 | Unauthorized | 請求要求用戶的身份認(rèn)證 | |
| 402 | Payment Required | 保留,將來使用 | |
| 403 | Forbidden | 服務(wù)器理解請求客戶端的請求,但是拒絕執(zhí)行此請求 | |
| 404 | Not Found | 服務(wù)器無法根據(jù)客戶端的請求找到資源(網(wǎng)頁)。通過此代碼,網(wǎng)站設(shè)計(jì)人員可設(shè)置"您所請求的資源無法找到"的個(gè)性頁面 | |
| 405 | Method Not Allowed | 客戶端請求中的方法被禁止 | |
| 406 | Not Acceptable | 服務(wù)器無法根據(jù)客戶端請求的內(nèi)容特性完成請求 | |
| 407 | Proxy Authentication Required | 請求要求代理的身份認(rèn)證,與401類似,但請求者應(yīng)當(dāng)使用代理進(jìn)行授權(quán) | |
| 408 | Request Time-out | 服務(wù)器等待客戶端發(fā)送的請求時(shí)間過長,超時(shí) | |
| 409 | Conflict | 服務(wù)器完成客戶端的 PUT 請求時(shí)可能返回此代碼,服務(wù)器處理請求時(shí)發(fā)生了沖突 | |
| 410 | Gone | 客戶端請求的資源已經(jīng)不存在。410不同于404,如果資源以前有現(xiàn)在被永久刪除了可使用410代碼,網(wǎng)站設(shè)計(jì)人員可通過301代碼指定資源的新位置 | |
| 411 | Length Required | 服務(wù)器無法處理客戶端發(fā)送的不帶Content-Length的請求信息 | |
| 412 | Precondition Failed | 客戶端請求信息的先決條件錯(cuò)誤 | |
| 413 | Request Entity Too Large | 由于請求的實(shí)體過大,服務(wù)器無法處理,因此拒絕請求。為防止客戶端的連續(xù)請求,服務(wù)器可能會(huì)關(guān)閉連接。如果只是服務(wù)器暫時(shí)無法處理,則會(huì)包含一個(gè)Retry-After的響應(yīng)信息 | |
| 414 | Request-URI Too Large | 請求的URI過長(URI通常為網(wǎng)址),服務(wù)器無法處理 | |
| 415 | Unsupported Media Type | 服務(wù)器無法處理請求附帶的媒體格式 | |
| 416 | Requested range not satisfiable | 客戶端請求的范圍無效 | |
| 417 | Expectation Failed | 服務(wù)器無法滿足Expect的請求頭信息 | |
| 500 | Internal Server Error | 服務(wù)器內(nèi)部錯(cuò)誤,無法完成請求 | |
| 501 | Not Implemented | 服務(wù)器不支持請求的功能,無法完成請求 | |
| 502 | Bad Gateway | 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時(shí),從遠(yuǎn)程服務(wù) | 器接收到了一個(gè)無效的響應(yīng) |
| 503 | Service Unavailable | 由于超載或系統(tǒng)維護(hù),服務(wù)器暫時(shí)的無法處理客戶端的請求。 | 延時(shí)的長度可包含在服務(wù)器的Retry-After頭信息中 |
| 504 | Gateway Time-out | 充當(dāng)網(wǎng)關(guān)或代理的服務(wù)器,未及時(shí)從遠(yuǎn)端服務(wù)器獲取請求 | |
| 505 | HTTP Version not supported | 服務(wù)器不支持請求的HTTP協(xié)議的版本,無法完成處理 |
HTTP響應(yīng)頭
| 應(yīng)答頭 | 說明 |
|---|---|
| Allow | 服務(wù)器支持哪些請求方法(如GET、POST等)。 |
| Content-Encoding | 文檔的編碼(Encode)方法。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時(shí)間。Java的GZIPOutputStream可以很方便地進(jìn)行g(shù)zip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet應(yīng)該通過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。 |
| Content-Length | 表示內(nèi)容長度。只有當(dāng)瀏覽器使用持久HTTP連接時(shí)才需要這個(gè)數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢,可以把輸出文檔寫入 ByteArrayOutputStream,完成后查看其大小,然后把該值放入Content-Length頭,最后通過byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容。 |
| Content-Type | 表示后面的文檔屬于什么MIME類型。Servlet默認(rèn)為text/plain,但通常需要顯式地指定為text/html。由于經(jīng)常要設(shè)置Content-Type,因此HttpServletResponse提供了一個(gè)專用的方法setContentType。 |
| Date | 當(dāng)前的GMT時(shí)間。你可以用setDateHeader來設(shè)置這個(gè)頭以避免轉(zhuǎn)換時(shí)間格式的麻煩。 |
| Expires | 應(yīng)該在什么時(shí)候認(rèn)為文檔已經(jīng)過期,從而不再緩存它? |
| Last-Modified | 文檔的最后改動(dòng)時(shí)間。客戶可以通過If-Modified-Since請求頭提供一個(gè)日期,該請求將被視為一個(gè)條件GET,只有改動(dòng)時(shí)間遲于指定時(shí)間的文檔才會(huì)返回,否則返回一個(gè)304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來設(shè)置。 |
| Location | 表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時(shí)設(shè)置狀態(tài)代碼為302。 |
| Refresh | 表示瀏覽器應(yīng)該在多少時(shí)間之后刷新文檔,以秒計(jì)。除了刷新當(dāng)前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面. 注意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實(shí)現(xiàn),這是因?yàn)?,自?dòng)刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設(shè)置Refresh頭更加方便。 注意Refresh的意義是"N秒之后刷新本頁面或訪問指定頁面",而不是"每隔N秒刷新本頁面或訪問指定頁面"。因此,連續(xù)刷新要求每次都發(fā)送一個(gè)Refresh頭,而發(fā)送204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,而是一個(gè)擴(kuò)展,但Netscape和IE都支持它。 |
| Server | 服務(wù)器名字。Servlet一般不設(shè)置這個(gè)值,而是由Web服務(wù)器自己設(shè)置。 |
| Set-Cookie | 設(shè)置和頁面關(guān)聯(lián)的Cookie。Servlet不應(yīng)使用response.setHeader("Set-Cookie", ...),而是應(yīng)使用HttpServletResponse提供的專用方法addCookie。參見下文有關(guān)Cookie設(shè)置的討論。 |
| WWW-Authenticate | 客戶應(yīng)該在Authorization頭中提供什么類型的授權(quán)信息?在包含401(Unauthorized)狀態(tài)行的應(yīng)答中這個(gè)頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 注意Servlet一般不進(jìn)行這方面的處理,而是讓W(xué)eb服務(wù)器的專門機(jī)制來控制受密碼保護(hù)頁面的訪問(例如.htaccess)。 |
HTTP content-Type
Content-Type,內(nèi)容類型,一般是指網(wǎng)頁中存在的Content-Type,用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個(gè)文件,這就是經(jīng)??吹揭恍〢sp網(wǎng)頁點(diǎn)擊的結(jié)果卻是下載到的一個(gè)文件或一張圖片的原因。
Content-Type 標(biāo)頭告訴客戶端實(shí)際返回的內(nèi)容的內(nèi)容類型。
語法格式:
Content-Type: text/html; charset=utf-8 Content-Type:
multipart/form-data; boundary=something
常見的媒體格式類型如下:
? text/html : HTML格式
? text/plain :純文本格式
? text/xml : XML格式
? image/gif :gif圖片格式
? image/jpeg :jpg圖片格式
? image/png:png圖片格式
以application開頭的媒體格式類型:
? application/xhtml+xml :XHTML格式
? application/xml: XML數(shù)據(jù)格式
? application/atom+xml :Atom XML聚合格式
? application/json: JSON數(shù)據(jù)格式
? application/pdf:pdf格式
? application/msword : Word文檔格式
? application/octet-stream : 二進(jìn)制流數(shù)據(jù)(如常見的文件下載)
? application/x-www-form-urlencoded : <form
encType=””>中默認(rèn)的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式)
另外一種常見的媒體格式是上傳文件之時(shí)使用的:
? multipart/form-data : 需要在表單中進(jìn)行文件上傳時(shí),就需要使用該格式
實(shí)例
下面實(shí)例是一點(diǎn)典型的使用GET來傳遞數(shù)據(jù)的實(shí)例:
客戶端請求:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
服務(wù)端響應(yīng):
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
輸出結(jié)果:
Hello World! My payload includes a trailing CRLF.
關(guān)于HTTP請求GET和POST的區(qū)別
1.提交
GET提交,請求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭<request-line>中),以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進(jìn)制表示的ASCII。
POST提交:把提交的數(shù)據(jù)放置在是HTTP包的包體<request-body>中。上文示例中紅色字體標(biāo)明的就是實(shí)際的傳輸數(shù)據(jù)
因此,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來,而POST提交,地址欄不會(huì)改變
2.傳輸數(shù)據(jù)的大?。?/strong>
首先聲明,HTTP協(xié)議沒有對傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制,HTTP協(xié)議規(guī)范也沒有對URL長度進(jìn)行限制。 而在實(shí)際開發(fā)中存在的限制主要有:
GET:特定瀏覽器和服務(wù)器對URL長度有限制,例如IE對URL長度的限制是2083字節(jié)(2K+35)。對于其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決于操作系統(tǒng)的支持。
因此對于GET提交時(shí),傳輸數(shù)據(jù)就會(huì)受到URL長度的限制。
POST:由于不是通過URL傳值,理論上數(shù)據(jù)不受限。但實(shí)際各個(gè)WEB服務(wù)器會(huì)規(guī)定對post提交數(shù)據(jù)大小進(jìn)行限制,Apache、IIS6都有各自的配置。
3.安全性:
POST的安全性要比GET的安全性高。注意:這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,因?yàn)?1)登錄頁面有可能被瀏覽器緩存, (2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號和密碼了,
內(nèi)容參考:菜鳥教程 https://www.runoob.com/http/http-content-type.html