今天中午學(xué)習(xí)了下http犀忱,之前沒有系統(tǒng)性的學(xué)過得院,只知道它是超文本傳輸協(xié)議左电,但對其的一些基本知識還是感覺還是很陌生的牌废。當(dāng)我中午看見http這個詞的時候祖灰,首先就想到的一個問題的就是,這是個協(xié)議是用來做什么的畔规?
帶著這個問題局扶,我們查找了資料,http設(shè)計之初是為了將超文本標(biāo)記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器∪ǎ現(xiàn)在http的作用已不局限于HTML的傳輸,圖片文件三妈,查詢結(jié)果等數(shù)據(jù)也是可以傳輸?shù)摹K耐ㄐ胚^程是這樣的:
那么莫绣,問題來了畴蒲,我在web 瀏覽器中輸入了網(wǎng)址之后到底發(fā)生了什么?它是如何到server的对室?server又是如何響應(yīng)瀏覽器的請求的模燥?我們來探究下這個過程咖祭。
一.http的請求響應(yīng)流程
我們先輸入網(wǎng)址以www.google.com為例,瀏覽器將顯示google的首頁蔫骂。在這個過程中么翰,通過Network的記錄,我們就可以知道辽旋。在Network中浩嫌,定位到第一條記錄,點擊补胚,右側(cè)將顯示Request Headers码耐,我們就可以看到瀏覽器發(fā)給google服務(wù)器的請求:
scheme:指定低層使用的協(xié)議(例如:http, https, ftp)
host:HTTP服務(wù)器的IP地址或者域名
port#:HTTP服務(wù)器的默認(rèn)端口是80,這種情況下端口號可以省略溶其。如果使用了別的端口骚腥,必須指明,例如http://www.mywebsite.com:8080/
path:訪問資源的路徑
Accept:我能接受這些類型的文件
User-Agent: 我使用的是何種操作系統(tǒng)上的哪個類型那個版本的瀏覽器
Accept-Encoding:承認(rèn)接受何種方式的壓縮文件
Cookie:發(fā)送存儲在本機(jī)的cookies信息給服務(wù)器
服務(wù)器又返回給瀏覽器了什么內(nèi)容?
200:表示一個響應(yīng)的狀態(tài)碼
Content-Type:指示響應(yīng)的內(nèi)容瓶逃,這里是text/html束铭,表示HTML網(wǎng)頁。
_ 請注意_:瀏覽器就是依靠Content-Type來判斷響應(yīng)的內(nèi)容是網(wǎng)頁還是圖片金闽,是視頻還是音樂纯露。瀏覽器并不靠URL來判斷響應(yīng)的內(nèi)容,所以代芜,即使URL是這樣的埠褪,如: http://example.com/abc.jpg, 它也不一定就是圖片挤庇。
所以钞速,我們總結(jié)http的請求流程如下:
1.瀏覽器首先向服務(wù)器發(fā)送HTTP請求,請求包括:
- 方法:GET還是POST嫡秕,GET僅請求資源渴语,POST會附帶用戶數(shù)據(jù);
- 路徑:/full/url/path昆咽;
- 域名:由Host頭指定:Host: www.google.com.cn驾凶;
以及其他相關(guān)的Header;
如果是POST掷酗,那么請求還包括一個Body调违,包含用戶數(shù)據(jù)。
2.服務(wù)器向瀏覽器返回HTTP響應(yīng),
- 響應(yīng)代碼:如200泻轰。
- 響應(yīng)類型:由Content-Type指定技肩;
- 以及其他相關(guān)的Header;
通常服務(wù)器的HTTP響應(yīng)會攜帶內(nèi)容浮声,也就是有一個Body虚婿,包含響應(yīng)的內(nèi)容旋奢,網(wǎng)頁的HTML源碼就在Body中。
3.如果瀏覽器還需要繼續(xù)向服務(wù)器請求其他資源然痊,比如圖片至朗,就再次發(fā)出HTTP請求,重復(fù)步驟1玷过、2爽丹。
搞清楚了http數(shù)據(jù)傳輸?shù)南嚓P(guān)流程筑煮,接下來我們看下和http相關(guān)的基本概念:
二.http的特點:
1.無連接
無連接的含義是限制每次連接只處理一個請求辛蚊。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后真仲,即斷開連接袋马。采用這種方式可以節(jié)省傳輸時間
2.媒體獨立
這意味著,只要客戶端和服務(wù)器知道如何處理的數(shù)據(jù)內(nèi)容秸应,任何類型的數(shù)據(jù)都可以通過HTTP發(fā)送虑凛。客戶端以及服務(wù)器指定使用適合的MIME-type內(nèi)容類型
3.無狀態(tài)
指的是協(xié)議對于事務(wù)處理沒有記憶能力软啼。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息桑谍,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大祸挪。另一方面锣披,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
換而言之:無狀態(tài)也就是說在同一個連接中贿条,兩個成功執(zhí)行的請求之間是沒有關(guān)系的雹仿。這就帶來了一個問題,用戶沒辦法在一個網(wǎng)站進(jìn)行連續(xù)的交互整以,比如在一個電商網(wǎng)站里胧辽,用戶把某個商品加入了購物車中,換了一個頁面后再次添加商品公黑,兩次添加商品的請求沒有聯(lián)系邑商,瀏覽器無法知道最終用戶都選擇了哪些商品。兩種用于保持HTTP連接狀態(tài)的技術(shù)就應(yīng)運(yùn)而生了凡蚜,一個是Cookie人断,而另一個則是Session。
三.http的消息結(jié)構(gòu)
1.客戶端請求消息:三部分
第一部分叫Request line(請求行)番刊, 第二部分叫http header含鳞,第三部分是body。
(1)請求行:包括http請求的種類芹务,請求資源的路徑蝉绷,http協(xié)議版本;
(2)http header:http頭部信息;
(3)body:發(fā)送給服務(wù)器的query信息 當(dāng)使用的是"GET" 方法的時候鸭廷,body是為空的(GET只能讀取服務(wù)器上的信息,post能寫入)
在上圖中熔吗,我們看見了URL ,那么問題問題來了辆床,URL 該如何理解?
URL:
(1) 概念:URL—Uniform Resource Location統(tǒng)一資源定位符桅狠,說白了就是我們常說的“網(wǎng)址”
(2) 組成:Protocol(協(xié)議)+Host(主機(jī))+Port(端口)+Query
示例URL:
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff
2.服務(wù)端響應(yīng)消息
也分為三部分讼载,第一部分叫request line, 第二部分叫request header,第三部分是body中跌。
(1)request line:協(xié)議版本咨堤、狀態(tài)碼、message
(2)request header:request頭信息
(3)body:返回的請求資源主體
四.HTTP請求方法
在客戶機(jī)和服務(wù)器之間進(jìn)行請求-響應(yīng)時漩符,兩種最常被用到的方法是:GET 和 POST,上面我們探究的過程中method告訴我們用到的是GET方法一喘。
GET - 從指定的資源請求數(shù)據(jù)。
POST - 向指定的資源提交要被處理的數(shù)據(jù)
其他的方法如下圖:
既然說道了get和post,那么常見的問題就來了嗜暴,get和post 的區(qū)別是什么凸克?在這里,我總結(jié)了一下它們的區(qū)別:
GET一般用于獲取/查詢資源信息闷沥,而POST一般用于更新資源信息.
1. GET 提交的數(shù)據(jù)會放在URL之后萎战,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連舆逃,如EditPosts.aspx?name=test1&id=123456蚂维。POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中。
2. GET提交的數(shù)據(jù)大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制.
3. GET方式需要使用Request.QueryString來取得變量的值颖侄,而POST方式通過Request.Form來獲取變量的值鸟雏。
4. GET方式提交數(shù)據(jù),會帶來安全問題览祖,比如一個登錄頁面孝鹊,通過GET方式提交數(shù)據(jù)時,用戶名和密碼將出現(xiàn)在URL上展蒂,如果頁面可以被緩存或者其他人可以訪問這臺機(jī)器又活,就可以從歷史記錄獲得該用戶的賬號和密碼.
接下來是什么問題呢?在上面我們看見如瀏覽器若請求后锰悼,則返回了一個狀態(tài)碼200,那么200有何含義柳骄,還有其他的狀態(tài)碼?
五.狀態(tài)碼
狀態(tài)碼由三位數(shù)字組成箕般,第一個數(shù)字定義了響應(yīng)的類別
1XX 提示信息 - 表示請求已被成功接收耐薯,繼續(xù)處理
2XX 成功 - 表示請求已被成功接收,理解,接受
3XX 重定向 - 要完成請求必須進(jìn)行更進(jìn)一步的處理
4XX 客戶端錯誤 - 請求有語法錯誤或請求無法實現(xiàn)
5XX 服務(wù)器端錯誤 - 服務(wù)器未能實現(xiàn)合法的請求
常見的狀態(tài)碼曲初,如下:
- 200 OK 請求被成功地完成体谒,所請求的資源發(fā)送回客戶端
- 302 Found 重定向,新的URL會在response中的Location中返回臼婆,瀏覽器將會使用新的URL發(fā)出新的Request
- 304 Not Modified 文檔已經(jīng)被緩存抒痒,直接從緩存調(diào)用
- 400 Bad Request 客戶端請求與語法錯誤,不能被服務(wù)器所理解
- 403 Forbidden 服務(wù)器收到請求颁褂,但是拒絕提供服務(wù)
- 404 Not Found 請求資源不存在
- 500 Internal Server Error 服務(wù)器發(fā)生了不可預(yù)期的錯誤
- 503 Server Unavailable 服務(wù)器當(dāng)前不能處理客戶端的請求故响,一段時間后可能恢復(fù)正常
最后一個問題就是,就是網(wǎng)頁中存在的Content-Type了颁独。
六.Content-Type
內(nèi)容類型彩届,一般是指網(wǎng)頁中存在的Content-Type,用于定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼奖唯,決定瀏覽器將以什么形式惨缆、什么編碼讀取這個文件糜值,這就是經(jīng)撤峤荩看到一些Asp網(wǎng)頁點擊的結(jié)果卻是下載到的一個文件或一張圖片的原因。
若想了解詳細(xì)的HTTP content-type 寂汇,請戳這個菜鳥網(wǎng)址
參考網(wǎng)址:
1.https://www.zybuluo.com/yangfch3/note/167490
2.https://www.zybuluo.com/yangfch3/note/113028
3.http://www.runoob.com/http/http-tutorial.html
4.http://www.w3school.com.cn/tags/html_ref_httpmethods.asp