摘要:協(xié)議的主要特點(diǎn)支持客戶服務(wù)器模式。由于協(xié)議簡(jiǎn)單,使得服務(wù)器的程序規(guī)模小,因而通信速度很快。無(wú)狀態(tài)協(xié)議是無(wú)狀態(tài)協(xié)議,無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。
前言
這篇文章是這個(gè)系列的開(kāi)篇,作為移動(dòng)開(kāi)發(fā)者,開(kāi)發(fā)的應(yīng)用不免會(huì)對(duì)網(wǎng)絡(luò)進(jìn)行訪問(wèn),雖然現(xiàn)在已經(jīng)有很多的開(kāi)源庫(kù)幫助我們可以輕而易舉的訪問(wèn)網(wǎng)絡(luò),但是我們?nèi)砸チ私饩W(wǎng)絡(luò)訪問(wèn)的原理,這也是一個(gè)優(yōu)秀開(kāi)發(fā)人員所必備的知識(shí)點(diǎn)。這篇文章我們就先來(lái)了解一下HTTP協(xié)議原理。
1.HTTP簡(jiǎn)介HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。
HTTP協(xié)議的主要特點(diǎn)支持C/S(客戶/服務(wù)器)模式。
簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST,每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省傳輸時(shí)間。
無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議,無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
HTTP URL 的格式如下http://host[":"port][abs_path]
http表示要通過(guò)HTTP協(xié)議來(lái)定位網(wǎng)絡(luò)資源;host表示合法的Internet主機(jī)域名或者IP地址;port指定一個(gè)端口號(hào),為空則使用默認(rèn)端口80;abs_path指定請(qǐng)求資源的URI(Web上任意的可用資源)。
HTTP有兩種報(bào)文分別是請(qǐng)求報(bào)文和響應(yīng)報(bào)文,讓我們先來(lái)看看請(qǐng)求報(bào)文。
先來(lái)看看請(qǐng)求報(bào)文的一般格式:
通常來(lái)說(shuō)一個(gè)HTTP請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求報(bào)頭、空行、和請(qǐng)求數(shù)據(jù)4個(gè)部分組成。
請(qǐng)求行請(qǐng)求行由請(qǐng)求方法,URL字段和HTTP協(xié)議的版本組成,格式如下:
Method Request-URI HTTP-Version CRLF
其中 Method表示請(qǐng)求方法;Request-URI是一個(gè)統(tǒng)一資源標(biāo)識(shí)符;HTTP-Version表示請(qǐng)求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結(jié)尾的CRLF外,不允許出現(xiàn)多帶帶的CR或LF字符)。
HTTP請(qǐng)求方法有8種,分別是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。其中PUT、DELETE、POST、GET分別對(duì)應(yīng)著增刪改查,對(duì)于移動(dòng)開(kāi)發(fā)最常用的就是POST和GET了。
GET:請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源
POST:在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)
HEAD 請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭
PUT 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)
DELETE 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源
TRACE 請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷
CONNECT 保留將來(lái)使用
OPTIONS 請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求
例如我去訪問(wèn)我的CSDN博客地址請(qǐng)求行是:
GET http://blog.csdn.net/itachi85 HTTP/1.1請(qǐng)求報(bào)頭
在請(qǐng)求行之后會(huì)有0個(gè)或者多個(gè)請(qǐng)求報(bào)頭,每個(gè)請(qǐng)求報(bào)頭都包含一個(gè)名字和一個(gè)值,它們之間用“:”分割。請(qǐng)求頭部會(huì)以一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不會(huì)有請(qǐng)求頭。關(guān)于請(qǐng)求報(bào)頭,會(huì)在后面的消息報(bào)頭一節(jié)做統(tǒng)一的解釋。
請(qǐng)求數(shù)據(jù)請(qǐng)求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場(chǎng)合,與請(qǐng)求數(shù)據(jù)相關(guān)的最常用的請(qǐng)求頭是Content-Type和Content-Length。
3.HTTP的響應(yīng)報(bào)文先來(lái)看看響應(yīng)報(bào)文的一般格式:
HTTP的響應(yīng)報(bào)文由狀態(tài)行、消息報(bào)頭、空行、響應(yīng)正文組成。響應(yīng)報(bào)頭后面會(huì)講到,響應(yīng)正文是服務(wù)器返回的資源的內(nèi)容,先來(lái)看看狀態(tài)行。
狀態(tài)行1、狀態(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)代碼的文本描述。
狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
100~199:指示信息,表示請(qǐng)求已接收,繼續(xù)處理
200~299:請(qǐng)求成功,表示請(qǐng)求已被成功接收、理解、接受
300~399:重定向,要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
400~499:客戶端錯(cuò)誤,請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
500~599:服務(wù)器端錯(cuò)誤,服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
常見(jiàn)的狀態(tài)碼如下:
200 OK:客戶端請(qǐng)求成功
400 Bad Request:客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized:請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常
例如訪問(wèn)我的CSDN博客地址響應(yīng)的狀態(tài)行是:
HTTP/1.1 200 OK4.HTTP的消息報(bào)頭
消息報(bào)頭分為通用報(bào)頭、請(qǐng)求報(bào)頭、響應(yīng)報(bào)頭、實(shí)體報(bào)頭等。消息頭由鍵值對(duì)組成,每行一對(duì),關(guān)鍵字和值用英文冒號(hào)“:"分隔。
通用報(bào)頭既可以出現(xiàn)在請(qǐng)求報(bào)頭,也可以出現(xiàn)在響應(yīng)報(bào)頭中
Date:表示消息產(chǎn)生的日期和時(shí)間
Connection:允許發(fā)送指定連接的選項(xiàng),例如指定連接是連續(xù)的,或者指定“close”選項(xiàng),通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接
Cache-Control:用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請(qǐng)求中未必會(huì)出現(xiàn)),且是獨(dú)立的(一個(gè)消息的緩存指令不會(huì)影響另一個(gè)消息處理的緩存機(jī)制)
請(qǐng)求報(bào)頭請(qǐng)求報(bào)頭通知服務(wù)器關(guān)于客戶端求求的信息,典型的請(qǐng)求頭有:
Host:請(qǐng)求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址,即虛擬主機(jī)
User-Agent:發(fā)送請(qǐng)求的瀏覽器類型、操作系統(tǒng)等信息
Accept:客戶端可識(shí)別的內(nèi)容類型列表,用于指定客戶端接收那些類型的信息
Accept-Encoding:客戶端可識(shí)別的數(shù)據(jù)編碼
Accept-Language:表示瀏覽器所支持的語(yǔ)言類型
Connection:允許客戶端和服務(wù)器指定與請(qǐng)求/響應(yīng)連接有關(guān)的選項(xiàng),例如這是為Keep-Alive則表示保持連接。
Transfer-Encoding:告知接收端為了保證報(bào)文的可靠傳輸,對(duì)報(bào)文采用了什么編碼方式。
響應(yīng)報(bào)頭用于服務(wù)器傳遞自身信息的響應(yīng),常見(jiàn)的響應(yīng)報(bào)頭:
Location:用于重定向接受者到一個(gè)新的位置,常用在更換域名的時(shí)候
Server:包含可服務(wù)器用來(lái)處理請(qǐng)求的系統(tǒng)信息,與User-Agent請(qǐng)求報(bào)頭是相對(duì)應(yīng)的
實(shí)體報(bào)頭實(shí)體報(bào)頭用來(lái)定于被傳送資源的信息,既可以用于請(qǐng)求也可用于響應(yīng)。請(qǐng)求和響應(yīng)消息都可以傳送一個(gè)實(shí)體,常見(jiàn)的實(shí)體報(bào)頭為:
Content-Type:發(fā)送給接收者的實(shí)體正文的媒體類型
Content-Lenght:實(shí)體正文的長(zhǎng)度
Content-Language:描述資源所用的自然語(yǔ)言,沒(méi)有設(shè)置則該選項(xiàng)則認(rèn)為實(shí)體內(nèi)容將提供給所有的語(yǔ)言閱讀
Content-Encoding:實(shí)體報(bào)頭被用作媒體類型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報(bào)頭域中所引用的媒體類型,必須采用相應(yīng)的解碼機(jī)制。
Last-Modified:實(shí)體報(bào)頭用于指示資源的最后修改日期和時(shí)間
Expires:實(shí)體報(bào)頭給出響應(yīng)過(guò)期的日期和時(shí)間
5.應(yīng)用舉例要想查看網(wǎng)頁(yè)或者手機(jī)請(qǐng)求網(wǎng)絡(luò)的請(qǐng)求報(bào)文和響應(yīng)報(bào)文有很多種方法,這里推薦采用Fiddler,在Android利用Fiddler進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)抓包這篇文章中詳盡介紹了如何使用Fiddler,在這里就不贅述了。
打開(kāi)Fiddler,然后用瀏覽器訪問(wèn)我的CSDN博客網(wǎng)站:
點(diǎn)擊紅色畫筆的區(qū)域就可以看到請(qǐng)求報(bào)文和響應(yīng)報(bào)文了
請(qǐng)求報(bào)文:
GET http://blog.csdn.net/itachi85 HTTP/1.1 //請(qǐng)求行 Host: blog.csdn.net //請(qǐng)求報(bào)頭 Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 QQBrowser/9.3.6872.400 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie: bdshare_firstime=1443768140949; uuid_tt_dd=5028529250430960147_20151002; ...省略
很容易看出訪問(wèn)的是我的博客地址http://blog.csdn.net/itachi85,請(qǐng)求的方法是GET,因?yàn)槭荊ET方法所以并沒(méi)有請(qǐng)求數(shù)據(jù)。
響應(yīng)報(bào)文:
HTTP/1.1 200 OK //狀態(tài)行 Server: openresty //響應(yīng)報(bào)頭 Date: Sun, 27 Mar 2016 08:26:54 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=20 Vary: Accept-Encoding Cache-Control: private X-Powered-By: PHP 5.4.28 Content-Encoding: gzip //不能省略的空格 28b5 }ysI 1?Fsgl n- ]{^_ { "z! C , m# 0 !l ` 4x ly .?* ?zAt_Xl * 9"O ? " ? 3 ^1a ...省略
響應(yīng)報(bào)文沒(méi)什么可說(shuō)的,接下來(lái)我們配置好手機(jī)網(wǎng)絡(luò)代理,訪問(wèn)一個(gè)應(yīng)用的界面
請(qǐng)求報(bào)文:
POST http://patientapi.shoujikanbing.com/api/common/getVersion HTTP/1.1 //請(qǐng)求行 Content-Length: 226 //請(qǐng)求報(bào)頭 Content-Type: application/x-www-form-urlencoded Host: patientapi.shoujikanbing.com Connection: Keep-Alive User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; MI NOTE LTE Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 Accept-Encoding: gzip //不能省略的空格,下面是請(qǐng)求數(shù)據(jù) clientversion=2_2.0.0&time=1459069342&appId=android&channel=hjwang&sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9&token=b191944d680145b5ed97f2f4ccf03058&deviceId=869436020220717&type=2&version=2.0.0
從請(qǐng)求報(bào)文的請(qǐng)求行來(lái)看,請(qǐng)求的方法是POST,請(qǐng)求地址為http://patientapi.shoujikanbing.com/api/common/getVersion,很顯然是獲取版本信息的接口。
響應(yīng)報(bào)文:
HTTP/1.1 200 OK //狀態(tài)行 Server: nginx //響應(yīng)報(bào)頭 Date: Sun, 27 Mar 2016 09:02:20 GMT Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Set-Cookie: sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; expires=Mon, 28-Mar-2016 09:02:20 GMT; Max-Age=86400; path=/; domain=.shoujikanbing.com Set-Cookie: PHPSESSID=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; path=/; domain=.shoujikanbing.com Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Encoding: gzip //不能省略的空格 17f //實(shí)體報(bào)文編碼格式為gzip所以顯示在這里的響應(yīng)數(shù)據(jù)是亂碼 mP N @ "E ? n m 1 w ( HL (1^ P nK E ?93"3gNLH 7P $c T 4a6 L:+ 1dY%$g h H + ...省略
響應(yīng)報(bào)文的實(shí)體采用的編碼格式為為gzip,所以在Fiddler軟件中顯示的是亂碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70563.html
摘要:面向字節(jié)流流,指的是流入到進(jìn)程或從進(jìn)程流出的字符序列。即收到連接信息后向返回確認(rèn)信息第三次握手客戶端收到服務(wù)器的報(bào)文段,并向服務(wù)器發(fā)送報(bào)文段。 前言 Socket的使用在 Android網(wǎng)絡(luò)編程中非常重要 今天我將帶大家全面了解 Socket 及 其使用方法 目錄 showImg(https://segmentfault.com/img/remote/14600000113508...
摘要:壓縮和緩存機(jī)制可以有效地減少網(wǎng)絡(luò)訪問(wèn)的流量,在提升速度和省電方面也起到了較大的作用。打開(kāi)來(lái)分析一下,不了解和協(xié)議原理的請(qǐng)查看網(wǎng)絡(luò)編程一協(xié)議原理這篇文章。當(dāng)然這次錯(cuò)誤是正常的,百度沒(méi)理由處理我們的這次請(qǐng)求。 前言 上一篇我們了解了HTTP協(xié)議原理,這一篇我們來(lái)講講Apache的HttpClient和Java的HttpURLConnection,這兩種都是我們平常請(qǐng)求網(wǎng)絡(luò)會(huì)用到的。無(wú)論我們...
閱讀 3495·2023-04-25 21:43
閱讀 3108·2019-08-29 17:04
閱讀 809·2019-08-29 16:32
閱讀 1546·2019-08-29 15:16
閱讀 2159·2019-08-29 14:09
閱讀 2749·2019-08-29 13:07
閱讀 1634·2019-08-26 13:32
閱讀 1329·2019-08-26 12:00