HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。
HTTP是一個基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 音視頻文件等)。
1、HTTP 工作原理
HTTP協(xié)議工作于客戶端-服務端架構上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發(fā)送所有請求迟几。
可以實現(xiàn) Web服務器 軟件有:
- 一般部署在 Linux 環(huán)境下的有
- Nginx,Apache 推出的 HTTPD 軟件包處理靜態(tài)頁面(HTM、 CSS文件舌狗、JavaScript 文件、 圖片文件等)
- Tomcat 一般用于處理 Java 語言編寫的動態(tài)網(wǎng)站扔水。
- Windos Server 環(huán)境下
- IIS服務器(Internet Information Services)是 微軟開發(fā)的部署在 Windows Server 操作系統(tǒng)上的一個服務痛侍。
Web服務器根據(jù)接收到的請求后,向客戶端發(fā)送響應信息魔市。
HTTP協(xié)議規(guī)定主届,服務的默認端口號為80,但是你也可以改為8080或者其他端口待德。
HTTP三點注意事項:
- HTTP是無連接:無連接的含義是限制每次連接只處理一個請求君丁。服務器處理完客戶的請求,并收到客戶的應答后磅网,即斷開連接谈截。采用這種方式可以節(jié)省傳輸時間。
- HTTP是無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力簸喂。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息毙死,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大喻鳄。另一方面扼倘,在服務器不需要先前信息時它的應答就較快。
以下圖表展示了HTTP協(xié)議通信流程:
2除呵、HTTP 消息結(jié)構
HTTP是基于客戶端/服務端(C/S)的架構模型再菊,通過一個可靠的鏈接來交換信息,是一個無狀態(tài)的請求/響應協(xié)議颜曾。
一個HTTP"客戶端"是一個應用程序(Web瀏覽器或其他任何客戶端)纠拔,通過連接到服務器達到向服務器發(fā)送一個或多個HTTP的請求的目的。
一個HTTP"服務器"同樣也是一個應用程序(通常是一個Web服務泛豪,如Apache Web服務器或IIS服務器等)稠诲,通過接收客戶端的請求并向客戶端發(fā)送HTTP響應數(shù)據(jù)。
HTTP使用統(tǒng)一資源標識符(Uniform Resource Identifiers, URI)來傳輸數(shù)據(jù)和建立連接诡曙。
3臀叙、客戶端請求消息
客戶端發(fā)送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部(header)价卤、空行和請求數(shù)據(jù)四個部分組成劝萤,下圖給出了請求報文的一般格式。
4慎璧、服務器響應消息
HTTP響應也由四個部分組成床嫌,分別是:狀態(tài)行、消息報頭炸卑、空行和響應正文既鞠。
實例
看公共課項目代碼
5、HTTP 請求方法
根據(jù)HTTP標準盖文,HTTP請求可以使用多種請求方法嘱蛋。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法五续。
6洒敏、HTTP 響應頭信息
應答頭 | 說明 |
---|---|
Allow(掌握) | 服務器支持哪些請求方法(如GET、POST等)疙驾。 |
Content-Encoding(掌握) | 文檔的字符編碼(Encode)方法凶伙。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型∷椋可以利用gzip對響應內(nèi)容進行壓縮函荣,這樣能夠顯著地減少HTML文檔的下載時間显押,通樣也節(jié)省了網(wǎng)絡流量。Java的GZIPOutputStream可以很方便地進行gzip壓縮傻挂。但是也比較舊的瀏覽器(比如 IE4 之前的瀏覽器)不支持 gzip, 因此乘碑,Servlet應該通過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面金拒,為其他瀏覽器返回普通頁面兽肤。 |
Content-Length(掌握) | 表示內(nèi)容長度。只有當瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)绪抛。如果你想要利用持久連接的優(yōu)勢资铡,可以把輸出文檔寫入 ByteArrayOutputStream,完成后查看其大小幢码,然后把該值放入Content-Length頭笤休,最后通過byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容。 |
Content-Type(重點掌握) | 表示POST請求或者響應的文檔內(nèi)容屬于什么MIME類型蛤育。Servlet默認為text/plain宛官,但通常需要顯式地指定為text/html。由于經(jīng)常要設置Content-Type瓦糕,因此HttpServletResponse提供了一個專用的方法setContentType。 |
Date(掌握) | 當前的GMT時間腋么。你可以用setDateHeader來設置這個頭以避免轉(zhuǎn)換時間格式的麻煩咕娄。 |
Expires | 告訴客戶端,應該在什么時候認為文檔已經(jīng)過期珊擂,從而不再緩存它圣勒,而發(fā)送一次新的HTTP請求。 |
Last-Modified | 文檔的最后改動時間摧扇∈ッ常客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET扛稽,只有改動時間遲于指定時間的文檔才會返回吁峻,否則返回一個304(Not Modified)狀態(tài)。Last-Modified也可用setDateHeader方法來設置在张。 |
Location(掌握) | 表示客戶應當?shù)侥睦锶ヌ崛∥臋n用含。Location通常不是直接設置的,而是通過HttpServletResponse的sendRedirect方法帮匾,該方法同時設置狀態(tài)代碼為302啄骇。 |
Refresh | 表示瀏覽器應該在多少時間之后刷新文檔,以秒計瘟斜。除了刷新當前文檔之外缸夹,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面痪寻。 注意這種功能通常是通過設置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現(xiàn),這是因為虽惭,自動刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要槽华。但是,對于Servlet來說趟妥,直接設置Refresh頭更加方便猫态。 注意Refresh的意義是"N秒之后刷新本頁面或訪問指定頁面",而不是"每隔N秒刷新本頁面或訪問指定頁面"披摄。因此亲雪,連續(xù)刷新要求每次都發(fā)送一個Refresh頭,而發(fā)送204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新疚膊,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>义辕。 注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,而是一個擴展寓盗,但Netscape和IE都支持它灌砖。 |
Server(掌握) | 服務器名字。Servlet一般不設置這個值傀蚌,而是由Web服務器自己設置基显。 |
Set-Cookie | 設置和頁面關聯(lián)的Cookie。Servlet不應使用response.setHeader("Set-Cookie", ...)善炫,而是應使用HttpServletResponse提供的專用方法addCookie撩幽。參見下文有關Cookie設置的討論。 |
WWW-Authenticate | 客戶應該在Authorization頭中提供什么類型的授權信息箩艺?在包含401(Unauthorized)狀態(tài)行的應答中這個頭是必需的窜醉。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")艺谆。 注意Servlet一般不進行這方面的處理榨惰,而是讓Web服務器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。 |
7静汤、HTTP 狀態(tài)碼
當瀏覽者訪問一個網(wǎng)頁時琅催,瀏覽者的瀏覽器會向網(wǎng)頁所在服務器發(fā)出請求。當瀏覽器接收并顯示網(wǎng)頁前撒妈,此網(wǎng)頁所在的服務器會返回一個包含HTTP狀態(tài)碼的信息頭(server header)用以響應瀏覽器的請求恢暖。
HTTP狀態(tài)碼的英文為HTTP Status Code。
注意:狀態(tài)碼及其包含的含義狰右,只是 HTTP 協(xié)議中規(guī)定的而已杰捂。實際開發(fā)網(wǎng)站時,大家都遵守這樣的規(guī)定棋蚌,這樣便于溝通傳遞信息嫁佳。
下面是常見的HTTP狀態(tài)碼及其含義:
- 200 - 請求成功
- 301 - 資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它URL
- 302 - 請求的資源被臨時重定向到其他 URL
- 403 - 無權獲取請求的資源
- 404 - 請求的資源(網(wǎng)頁等)不存在
- 500 - 內(nèi)部服務器錯誤(一般是開發(fā)寫的程序代碼出現(xiàn)了錯誤)
HTTP狀態(tài)碼分類
HTTP狀態(tài)碼由三個十進制數(shù)字組成挨队,第一個十進制數(shù)字定義了狀態(tài)碼的類型。HTTP狀態(tài)碼共分為5種類型:
HTTP狀態(tài)碼列表:
狀態(tài)碼 | 狀態(tài)碼英文名稱 | 中文描述 |
---|---|---|
100 | Continue | 繼續(xù)蒿往∈⒖眩客戶端應繼續(xù)其請求 |
101 | Switching Protocols | 切換協(xié)議。服務器根據(jù)客戶端的請求切換協(xié)議瓤漏。只能切換到更高級的協(xié)議腾夯,例如,切換到HTTP的新版本協(xié)議 |
200 | OK | 請求成功蔬充。一般用于GET與POST請求 |
201 | Created | 已創(chuàng)建蝶俱。成功請求并創(chuàng)建了新的資源 |
202 | Accepted | 已接受。已經(jīng)接受請求饥漫,但未處理完成 |
203 | Non-Authoritative Information | 非授權信息榨呆。請求成功。但返回的meta信息不在原始的服務器庸队,而是一個副本 |
204 | No Content | 無內(nèi)容积蜻。服務器成功處理,但未返回內(nèi)容彻消。在未更新網(wǎng)頁的情況下竿拆,可確保瀏覽器繼續(xù)顯示當前文檔 |
205 | Reset Content | 重置內(nèi)容。服務器處理成功证膨,用戶終端(例如:瀏覽器)應重置文檔視圖如输。可通過此返回碼清除瀏覽器的表單域 |
206 | Partial Content | 部分內(nèi)容央勒。服務器成功處理了部分GET請求 |
300 | Multiple Choices | 多種選擇。請求的資源可包括多個位置澳化,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 |
301 | Moved Permanently | 永久移動崔步。請求的資源已被永久的移動到新URI,返回信息會包括新的URI缎谷,瀏覽器會自動定向到新URI井濒。今后任何新的請求都應使用新的URI代替 |
302 | Found | 臨時移動。與301類似列林。但資源只是臨時被移動瑞你。客戶端應繼續(xù)使用原有URI |
303 | See Other | 查看其它地址希痴。與301類似者甲。使用GET和POST請求查看 |
304 | Not Modified | 未修改。所請求的資源未修改砌创,服務器返回此狀態(tài)碼時虏缸,不會返回任何資源鲫懒。客戶端通常會緩存訪問過的資源刽辙,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源 |
305 | Use Proxy | 使用代理窥岩。所請求的資源必須通過代理訪問 |
306 | Unused | 已經(jīng)被廢棄的HTTP狀態(tài)碼 |
307 | Temporary Redirect | 臨時重定向宰缤。與302類似慨灭。使用GET請求重定向 |
400 | Bad Request | 客戶端請求的語法錯誤缘挑,服務器無法理解 |
401 | Unauthorized | 請求要求用戶的身份認證 |
402 | Payment Required | 保留,將來使用 |
403 | Forbidden | 服務器理解請求客戶端的請求诲宇,但是拒絕執(zhí)行此請求 |
404 | Not Found | 服務器無法根據(jù)客戶端的請求找到資源(網(wǎng)頁)姑蓝。通過此代碼纺荧,網(wǎng)站設計人員可設置"您所請求的資源無法找到"的個性頁面 |
405 | Method Not Allowed | 客戶端請求中的方法被禁止 |
406 | Not Acceptable | 服務器無法根據(jù)客戶端請求的內(nèi)容特性完成請求 |
407 | Proxy Authentication Required | 請求要求代理的身份認證宙暇,與401類似占贫,但請求者應當使用代理進行授權 |
408 | Request Time-out | 服務器等待客戶端發(fā)送的請求時間過長型奥,超時 |
409 | Conflict | 服務器完成客戶端的PUT請求是可能返回此代碼厢汹,服務器處理請求時發(fā)生了沖突 |
410 | Gone | 客戶端請求的資源已經(jīng)不存在烫葬。410不同于404厘灼,如果資源以前有現(xiàn)在被永久刪除了可使用410代碼设凹,網(wǎng)站設計人員可通過301代碼指定資源的新位置 |
411 | Length Required | 服務器無法處理客戶端發(fā)送的不帶Content-Length的請求信息 |
412 | Precondition Failed | 客戶端請求信息的先決條件錯誤 |
413 | Request Entity Too Large | 由于請求的實體過大,服務器無法處理月匣,因此拒絕請求锄开。為防止客戶端的連續(xù)請求萍悴,服務器可能會關閉連接癣诱。如果只是服務器暫時無法處理撕予,則會包含一個Retry-After的響應信息 |
414 | Request-URI Too Large | 請求的URI過長(URI通常為網(wǎng)址),服務器無法處理 |
415 | Unsupported Media Type | 服務器無法處理請求附帶的媒體格式 |
416 | Requested range not satisfiable | 客戶端請求的范圍無效 |
417 | Expectation Failed | 服務器無法滿足Expect的請求頭信息 |
500 | Internal Server Error | 服務器內(nèi)部錯誤欢策,無法完成請求 |
501 | Not Implemented | 服務器不支持請求的功能踩寇,無法完成請求 |
502 | Bad Gateway | 作為網(wǎng)關或者代理工作的服務器嘗試執(zhí)行請求時姑荷,從遠程服務器接收到了一個無效的響應 |
503 | Service Unavailable | 由于超載或系統(tǒng)維護鼠冕,服務器暫時的無法處理客戶端的請求懈费。延時的長度可包含在服務器的Retry-After頭信息中 |
504 | Gateway Time-out | 充當網(wǎng)關或代理的服務器憎乙,未及時從遠端服務器獲取請求 |
505 | HTTP Version not supported | 服務器不支持請求的HTTP協(xié)議的版本泞边,無法完成處理 |