http協(xié)議
1. 概念:超文本傳輸協(xié)議,建立在TCP協(xié)議之上的無狀態(tài)傳輸協(xié)議,客戶端發(fā)送一個請求,說明想要操作的資源和動作,服務(wù)端響應(yīng)請求返回資源與狀態(tài)碼。
2.http請求:狀態(tài)行,請求頭,請求正文。
狀態(tài)行:包括請求方式Method、資源路徑URL、協(xié)議版本Version;
請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;
請求正文:就是HTTP請求的數(shù)據(jù)。
3.HTTP響應(yīng)由三部分組成:狀態(tài)行、響應(yīng)頭、響應(yīng)正文;
狀態(tài)行:包括協(xié)議版本Version、狀態(tài)碼Status Code、回應(yīng)短語;
響應(yīng)頭:包括搭建服務(wù)器的軟件,發(fā)送響應(yīng)的時間,回應(yīng)數(shù)據(jù)的格式等信息;
響應(yīng)正文:就是響應(yīng)的具體數(shù)據(jù)。
4.狀態(tài)碼
200---OK/請求已經(jīng)正常處理完畢
301---/請求永久重定向
302---/請求臨時重定向
304---/請求被重定向到客戶端本地緩存
400---/客戶端請求存在語法錯誤
401---/客戶端請求沒有經(jīng)過授權(quán)
403---/客戶端的請求被服務(wù)器拒絕,一般為客戶端沒有訪問權(quán)限
404---/客戶端請求的URL在服務(wù)端不存在
500---/服務(wù)端永久錯誤
503---/服務(wù)端發(fā)生臨時錯誤
當我們在瀏覽器的地址欄輸入“www.baidu.com”然后按回車,這之后發(fā)生了什么事,我們直接看到的是打開了對應(yīng)的網(wǎng)頁,那么內(nèi)部客戶端和服務(wù)端是如何通信的呢?
1、?1、URL自動解析
????? HTTP URL包含了用于查找某個資源的足夠信息,基本格式如下:HTTP://host[“:”port][abs_path],其中HTTP表示桶蓋HTTP協(xié)議來定位網(wǎng)絡(luò)資源;host表示合法的主機域名或IP地址,port指定一個端口號,缺省80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
例如:輸入www.163.com;瀏覽器會自動轉(zhuǎn)換成:HTTP://www.163.com/
2、獲取IP,建立TCP連接
瀏覽器地址欄中輸入"HTTP://www.xxx.com/"并提交之后,首先它會在DNS本地緩存表中查找,如果有則直接告訴IP地址。如果沒有則要求網(wǎng)關(guān)DNS進行查找,如此下去,找到對應(yīng)的IP后,則返回會給瀏覽器。
當獲取IP之后,就開始與所請求的Tcp建立三次握手連接,連接建立后,就向服務(wù)器發(fā)出HTTP請求。
3、客戶端瀏覽器向服務(wù)器發(fā)出HTTP請求
一旦建立了TCP連接,Web瀏覽器就會向Web服務(wù)器發(fā)送請求命令,接著以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送。
例如:GET/sample/hello.jsp HTTP/1.1
4、Web服務(wù)器應(yīng)答,并向瀏覽器發(fā)送數(shù)據(jù)
客戶機向服務(wù)器發(fā)出請求后,服務(wù)器會客戶機回送應(yīng)答,
HTTP/1.1 200 OK
應(yīng)答的第一部分是協(xié)議的版本號和應(yīng)答狀態(tài)碼,正如客戶端會隨同請求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請求的文檔。
Web服務(wù)器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)
5、Web服務(wù)器關(guān)閉TCP連接
一般情況下,一旦Web服務(wù)器向瀏覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個請求建立新連接所需的時間,還節(jié)約了網(wǎng)絡(luò)帶寬。
HTTP消息頭是指,在超文本傳輸協(xié)議( Hypertext Transfer Protocol ,HTTP)的請求和響應(yīng)消息中,協(xié)議頭部分的那些組件。HTTP消息頭用來準確描述正在獲取的資源、服務(wù)器或者客戶端的行為,定義了HTTP事務(wù)中的具體操作參數(shù)。
https://www.cnblogs.com/honghong87/articles/6941436.html
HTTP請求方法
Http協(xié)議定義了很多與服務(wù)器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE.
一個URL地址用于描述一個網(wǎng)絡(luò)上的資源,而HTTP中的GET, POST, PUT, DELETE就對應(yīng)著對這個資源的查,改,增,刪4個操作。
我們最常見的就是GET和POST了。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息.
1、GET -?最常見的一種請求方式
當客戶端要從服務(wù)器中讀取文檔時,當點擊網(wǎng)頁上的鏈接或者通過在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁的,使用的都是GET方式。
GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報文的數(shù)據(jù)部分,回送給客戶端。
使用GET方法時,請求參數(shù)和對應(yīng)的值附加在URL后面,利用一個問號(“?”)代表URL的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制。
例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的參數(shù)直接表示在地址中
以用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: http://www.google.cn/?
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: www.google.cn?
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)在請求行。地址鏈接如下:
http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=
地址中”?”之后的部分就是通過GET發(fā)送的請求數(shù)據(jù),在地址欄中可以看到,各個數(shù)據(jù)之間用”&”符號隔開。很顯然,這種方式不適合傳送私密數(shù)據(jù)。
另外,由于不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個字符,所以如果需要傳送大量數(shù)據(jù)的時候,也不適合使用GET方式。
2、POST
對于上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因為使用POST方法可以允許客戶端給服務(wù)器提供信息較多。POST方法將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù),這樣POST方式對傳送的數(shù)據(jù)大小沒有限制,而且也不會顯示在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: http://www.google.cn/
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: www.google.cn
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
hl=zh-CN&source=hp&q=domety
可以看到,POST方式請求行中不包含數(shù)據(jù)字符串,這些數(shù)據(jù)保存在”請求內(nèi)容”部分,各數(shù)據(jù)之間也是使用”&”符號隔開。
POST方式大多用于頁面的表單中。因為POST也能完成GET的功能,因此多數(shù)人在設(shè)計表單的時候一律都使用POST方式,其實這是一個誤區(qū)。
GET方式也有自己的特點和優(yōu)勢,我們應(yīng)該根據(jù)不同的情況來選擇是使用GET還是使用POST。
3、HEAD
HEAD就像GET,只不過服務(wù)端接受到HEAD請求后只返回響應(yīng)頭,而不會發(fā)送響應(yīng)內(nèi)容。當我們只需要查看某個頁面的狀態(tài)的時候,使用HEAD是非常高效的,因為在傳輸?shù)倪^程中省去了頁面內(nèi)容。
4、Get和Post方法的區(qū)別
我們看看GET和POST的區(qū)別
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上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
面試題:
https://www.cnblogs.com/Java3y/p/8444033.html