摘要:協(xié)議的主要特點支持客戶服務器模式。由于協(xié)議簡單,使得服務器的程序規(guī)模小,因而通信速度很快。無狀態(tài)協(xié)議是無狀態(tài)協(xié)議,無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。
前言
這篇文章是這個系列的開篇,作為移動開發(fā)者,開發(fā)的應用不免會對網(wǎng)絡進行訪問,雖然現(xiàn)在已經(jīng)有很多的開源庫幫助我們可以輕而易舉的訪問網(wǎng)絡,但是我們仍要去了解網(wǎng)絡訪問的原理,這也是一個優(yōu)秀開發(fā)人員所必備的知識點。這篇文章我們就先來了解一下HTTP協(xié)議原理。
1.HTTP簡介HTTP是一個屬于應用層的面向對象的協(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴展。
HTTP協(xié)議的主要特點支持C/S(客戶/服務器)模式。
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST,每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務器的程序規(guī)模小,因而通信速度很快。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議,無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
HTTP URL 的格式如下http://host[":"port][abs_path]
http表示要通過HTTP協(xié)議來定位網(wǎng)絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用默認端口80;abs_path指定請求資源的URI(Web上任意的可用資源)。
HTTP有兩種報文分別是請求報文和響應報文,讓我們先來看看請求報文。
先來看看請求報文的一般格式:
通常來說一個HTTP請求報文由請求行、請求報頭、空行、和請求數(shù)據(jù)4個部分組成。
請求行請求行由請求方法,URL字段和HTTP協(xié)議的版本組成,格式如下:
Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統(tǒng)一資源標識符;HTTP-Version表示請求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現(xiàn)多帶帶的CR或LF字符)。
HTTP請求方法有8種,分別是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。其中PUT、DELETE、POST、GET分別對應著增刪改查,對于移動開發(fā)最常用的就是POST和GET了。
GET:請求獲取Request-URI所標識的資源
POST:在Request-URI所標識的資源后附加新的數(shù)據(jù)
HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭
PUT 請求服務器存儲一個資源,并用Request-URI作為其標識
DELETE 請求服務器刪除Request-URI所標識的資源
TRACE 請求服務器回送收到的請求信息,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
例如我去訪問我的CSDN博客地址請求行是:
GET http://blog.csdn.net/itachi85 HTTP/1.1請求報頭
在請求行之后會有0個或者多個請求報頭,每個請求報頭都包含一個名字和一個值,它們之間用“:”分割。請求頭部會以一個空行,發(fā)送回車符和換行符,通知服務器以下不會有請求頭。關于請求報頭,會在后面的消息報頭一節(jié)做統(tǒng)一的解釋。
請求數(shù)據(jù)請求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合,與請求數(shù)據(jù)相關的最常用的請求頭是Content-Type和Content-Length。
3.HTTP的響應報文先來看看響應報文的一般格式:
HTTP的響應報文由狀態(tài)行、消息報頭、空行、響應正文組成。響應報頭后面會講到,響應正文是服務器返回的資源的內容,先來看看狀態(tài)行。
狀態(tài)行1、狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協(xié)議的版本;Status-Code表示服務器發(fā)回的響應狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應的類別,且有五種可能取值:
100~199:指示信息,表示請求已接收,繼續(xù)處理
200~299:請求成功,表示請求已被成功接收、理解、接受
300~399:重定向,要完成請求必須進行更進一步的操作
400~499:客戶端錯誤,請求有語法錯誤或請求無法實現(xiàn)
500~599:服務器端錯誤,服務器未能實現(xiàn)合法的請求
常見的狀態(tài)碼如下:
200 OK:客戶端請求成功
400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized:請求未經(jīng)授權,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden:服務器收到請求,但是拒絕提供服務
500 Internal Server Error:服務器發(fā)生不可預期的錯誤
503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
例如訪問我的CSDN博客地址響應的狀態(tài)行是:
HTTP/1.1 200 OK4.HTTP的消息報頭
消息報頭分為通用報頭、請求報頭、響應報頭、實體報頭等。消息頭由鍵值對組成,每行一對,關鍵字和值用英文冒號“:"分隔。
通用報頭既可以出現(xiàn)在請求報頭,也可以出現(xiàn)在響應報頭中
Date:表示消息產(chǎn)生的日期和時間
Connection:允許發(fā)送指定連接的選項,例如指定連接是連續(xù)的,或者指定“close”選項,通知服務器,在響應完成后,關閉連接
Cache-Control:用于指定緩存指令,緩存指令是單向的(響應中出現(xiàn)的緩存指令在請求中未必會出現(xiàn)),且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制)
請求報頭請求報頭通知服務器關于客戶端求求的信息,典型的請求頭有:
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機
User-Agent:發(fā)送請求的瀏覽器類型、操作系統(tǒng)等信息
Accept:客戶端可識別的內容類型列表,用于指定客戶端接收那些類型的信息
Accept-Encoding:客戶端可識別的數(shù)據(jù)編碼
Accept-Language:表示瀏覽器所支持的語言類型
Connection:允許客戶端和服務器指定與請求/響應連接有關的選項,例如這是為Keep-Alive則表示保持連接。
Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式。
響應報頭用于服務器傳遞自身信息的響應,常見的響應報頭:
Location:用于重定向接受者到一個新的位置,常用在更換域名的時候
Server:包含可服務器用來處理請求的系統(tǒng)信息,與User-Agent請求報頭是相對應的
實體報頭實體報頭用來定于被傳送資源的信息,既可以用于請求也可用于響應。請求和響應消息都可以傳送一個實體,常見的實體報頭為:
Content-Type:發(fā)送給接收者的實體正文的媒體類型
Content-Lenght:實體正文的長度
Content-Language:描述資源所用的自然語言,沒有設置則該選項則認為實體內容將提供給所有的語言閱讀
Content-Encoding:實體報頭被用作媒體類型的修飾符,它的值指示了已經(jīng)被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。
Last-Modified:實體報頭用于指示資源的最后修改日期和時間
Expires:實體報頭給出響應過期的日期和時間
5.應用舉例要想查看網(wǎng)頁或者手機請求網(wǎng)絡的請求報文和響應報文有很多種方法,這里推薦采用Fiddler,在Android利用Fiddler進行網(wǎng)絡數(shù)據(jù)抓包這篇文章中詳盡介紹了如何使用Fiddler,在這里就不贅述了。
打開Fiddler,然后用瀏覽器訪問我的CSDN博客網(wǎng)站:
點擊紅色畫筆的區(qū)域就可以看到請求報文和響應報文了
請求報文:
GET http://blog.csdn.net/itachi85 HTTP/1.1 //請求行 Host: blog.csdn.net //請求報頭 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; ...省略
很容易看出訪問的是我的博客地址http://blog.csdn.net/itachi85,請求的方法是GET,因為是GET方法所以并沒有請求數(shù)據(jù)。
響應報文:
HTTP/1.1 200 OK //狀態(tài)行 Server: openresty //響應報頭 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 ...省略
響應報文沒什么可說的,接下來我們配置好手機網(wǎng)絡代理,訪問一個應用的界面
請求報文:
POST http://patientapi.shoujikanbing.com/api/common/getVersion HTTP/1.1 //請求行 Content-Length: 226 //請求報頭 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 //不能省略的空格,下面是請求數(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
從請求報文的請求行來看,請求的方法是POST,請求地址為http://patientapi.shoujikanbing.com/api/common/getVersion,很顯然是獲取版本信息的接口。
響應報文:
HTTP/1.1 200 OK //狀態(tài)行 Server: nginx //響應報頭 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 //實體報文編碼格式為gzip所以顯示在這里的響應數(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 + ...省略
響應報文的實體采用的編碼格式為為gzip,所以在Fiddler軟件中顯示的是亂碼。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/70563.html
摘要:面向字節(jié)流流,指的是流入到進程或從進程流出的字符序列。即收到連接信息后向返回確認信息第三次握手客戶端收到服務器的報文段,并向服務器發(fā)送報文段。 前言 Socket的使用在 Android網(wǎng)絡編程中非常重要 今天我將帶大家全面了解 Socket 及 其使用方法 目錄 showImg(https://segmentfault.com/img/remote/14600000113508...
摘要:壓縮和緩存機制可以有效地減少網(wǎng)絡訪問的流量,在提升速度和省電方面也起到了較大的作用。打開來分析一下,不了解和協(xié)議原理的請查看網(wǎng)絡編程一協(xié)議原理這篇文章。當然這次錯誤是正常的,百度沒理由處理我們的這次請求。 前言 上一篇我們了解了HTTP協(xié)議原理,這一篇我們來講講Apache的HttpClient和Java的HttpURLConnection,這兩種都是我們平常請求網(wǎng)絡會用到的。無論我們...
閱讀 3661·2023-04-25 21:43
閱讀 3168·2019-08-29 17:04
閱讀 870·2019-08-29 16:32
閱讀 1601·2019-08-29 15:16
閱讀 2212·2019-08-29 14:09
閱讀 2808·2019-08-29 13:07
閱讀 1682·2019-08-26 13:32
閱讀 1376·2019-08-26 12:00