HTTP又稱超文本傳輸協定,在網際網路上廣為流傳和應用。
今天主要講這麼幾個?
a.針對HTTP下細分為:
HTTP概念、Request和Response詳解、Request中GET和POST的差別、說說RestFul等。
b.面試常考題
比如 當在浏覽器上輸入www.challengertech.com會發生什麼。
一、HTTP
1.HTTP概念
HTTP協定是Hyper Text Transfer Protocol(超文本傳輸協定)的縮寫,是用于從網際網路(WWW:World Wide Web )伺服器傳輸超文本到本地浏覽器的傳送協定。
HTTP是一個基于TCP/IP通信協定來傳遞資料(HTML 檔案, 圖檔檔案等)。
HTTP是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,适用于分布式超媒體資訊系統。
HTTP協定工作于用戶端-服務端架構為上。浏覽器作為HTTP用戶端通過URL向HTTP服務端即WEB伺服器發送所有請求。Web伺服器根據接收到的請求後,向用戶端發送響應資訊。
如圖:

主要特點:
(1)簡單快速:客戶向伺服器請求服務時,隻需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯系的類型不同。由于HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。
(2)靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以标記。
(3)無連接配接:無連接配接的含義是限制每次連接配接隻處理一個請求。伺服器處理完客戶的請求,并收到客戶的應答後,即斷開連接配接。采用這種方式可以節省傳輸時間。
(4)無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
(5)支援B/S和C/S模式
B/S模式是目前最流行的,在這裡不得不提到B/S模式的兩方面優點:
a.統一的用戶端(浏覽器,比如Chrome、火狐、IE等常用浏覽器);
b.統一的HTTP協定;
C/S模式同樣支援,比如雖然沒有幾年前那麼火的安卓應用。
說到HTTP不得不提到URL(統一資源定位符)
以例子來講解完整的URL
http://www.challengertech.com:8090/blog/post.jsp?postId=1
從上面的例子可看出,一個完整的URL需要包含如下幾部分:
a.協定:例如http
b.端口:比如例子中的8090
c.域名部分:比如www.challengertech.com 其實也可以是IP位址
d.虛拟目錄:比如例子中的blog是一個虛拟目錄,同樣它也是項目名
e.檔案名:比如例子中的post.jsp是一個檔案
f.參數:通常get請求攜帶參數,都會追加到請求路徑後面
g.錨:從#開始的後面部分都是錨,一般用的非常少
URL和URI的差別如下:
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來辨別一個資源,而且還指明了如何locate這個資源。
URL是Internet上用來描述資訊資源的字元串,主要用在各種WWW客戶程式和伺服器程式上
采用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的位址和目錄等。URL一般由三部組成:
①協定(或稱為服務方式)
②存有該資源的主機IP位址(有時也包括端口号)
③主機資源的具體位址。如目錄和檔案名等
URI,是uniform resource identifier,統一資源辨別符,用來唯一的辨別一個資源。
Web上可用的每種資源如HTML文檔、圖像、視訊片段、程式等都是一個來URI來定位的
URI一般由三部組成:
①通路資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,着重強調于資源。
URN,uniform resource name,統一資源命名,是通過名字來辨別資源,比如mailto:[email protected]。
URI是以一種抽象的,高層次概念定義統一資源辨別,而URL和URN則是具體的資源辨別的方式。URL和URN都是一種URI。籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL。這是因為 URI 還包括一個子類,即統一資源名稱 (URN),它命名資源并不指定如何定位資源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
在Java的URI中,一個URI執行個體可以代表絕對的,也可以是相對的,隻要它符合URI的文法規則。而URL類則不僅符合語義,還包含了定位該資源的資訊,是以它不能是相對的。
在Java類庫中,URI類不包含任何通路資源的方法,它唯一的作用就是解析。
相反的是,URL類可以打開一個到達資源的流。
2.Request和Response參數詳解
(1)Request
用戶端發送一個HTTP請求到伺服器的請求消息包括以下格式:
請求行、請求頭、空行、請求資料等四部分
第一部分:請求行,用來說明請求類型,要通路的資源以及所使用的HTTP版本.
GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要通路的資源,該行的最後一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部,緊接着請求行(即第一行)之後的部分,用來說明伺服器要使用的附加資訊
從第二行起為請求頭部,HOST将指出請求的目的地.User-Agent,伺服器端和用戶端腳本都能通路它,它是浏覽器類型檢測邏輯的重要基礎.該資訊由你的浏覽器來定義,并且在每個請求中自動發送等等
這個User-Agent很重要,比如我再關于微信如何識别是電腦端還是手機端,關鍵就是這個User-Agent,根據它來判斷,如果是電腦端直接就下載下傳,非電腦端,如果是微信的話,需要打開浏覽器重定向到對應的位址下載下傳App。
第三部分:空行,請求頭部後面的空行是必須的
即使第四部分的請求資料為空,也必須有空行。
第四部分:請求資料也叫主體,可以添加任意的其他資料。
此例子為空
(2)Response
一般情況下,伺服器接收并處理用戶端發過來的請求後會傳回一個HTTP的響應消息。
Response也由四部分組成,狀态行、消息報頭、空行、響應文
第一部分:狀态行,由HTTP協定版本号, 狀态碼, 狀态消息 三部分組成。
第一行為狀态行,(HTTP/1.1)表明HTTP版本為1.1版本,狀态碼為200,狀态消息為(ok)
第二部分:消息報頭,用來說明用戶端要使用的一些附加資訊
第二行和第三行為消息報頭,
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭後面的空行是必須的
第四部分:響應正文,伺服器傳回給用戶端的文本資訊。
空行後面的html部分為響應正文。
3.Request常用的GET和POST差別
這裡引用W3CSCHOOL:
4.說說RestFul
用我的話來說,将對資源的操作進行歸類,比如如果我要添加某個資源時,使用POST,删除使用DELETE,修改使用PUT,擷取資料使用GET。
簡而言之,如果是涉及對資料的改動,使用POST、DELETE、PUT,POST大家都知道,至于DELETE、PUT其實和POST是一樣的,資料不可見,安全性高。
對于擷取資料,使用GET就行了。
二、面試常見考題
當你在浏覽器輸入:www.challengertech.com會發生什麼?
這裡我引用《深入分析JavaWeb技術内幕》的截圖,這本書也是我最近在看的。
我覺得這個圖,可以很好的解釋這個問題的答案。
小結:HTTP是目前B/S模式開發常用的協定,不管是使用Java開發還是C#開發或者是目前流行的Python,所開發的Web應用大多遵循HTTP協定,是以正如上學時的一句名言,“學好數理化,走遍天下都不怕”。
在HTTP中同樣使用。當然了,HTTP隻是TCP/IP的一個應用層協定之一,還有UDP,FTP,SMTP等等。但是那些都不是關鍵,關鍵就是TCP/IP,把這個關鍵點,把好了,了解透徹了,是大有裨益的。自畢業後,愈發覺得基礎的重要性。技術永遠都是日新月異的,不變的就是那些看似不起眼的,把握好它們,意味着你成為自己職業發展的主宰。正所謂“萬變不離其宗”,就是這麼個理。
HTTP部分主要參考了這篇文章:http://www.cnblogs.com/ranyonsue/p/5984001.html
我認為該作者寫的挺不錯的,将其推薦給大家。
當然了,希望這篇文章能給你們帶來有益的啟發和收獲。