Android網路程式設計(Http協議篇)
前言
這篇文章是這個系列的基礎之一,應用絕大多數不會避開對網路進行訪問,雖然現在已經有很多的開源庫如:voley,retrofit等幫助我們來輕而易舉的訪問網路,但是我們仍要去了解網路訪問的原理,這也是一個優秀開發人員所必備的知識。這篇文章是這個系列的基礎篇,我們先來了解一下HTTP協議相關的內容。
簡介
- 首先HTTP全稱是Hyper Text Transfer Protocol,翻譯過來叫超文字傳輸協議,看起來很高階的名字,實際上他就是字面意思,就比如你想知道“HTTP協議是什麼”,伺服器上呢有個超文字,就姑且當他是個記事本里面記錄著“HTTP協議是什麼”的答案,你想要,那麼伺服器就和你約定好了用“順豐快遞傳”,所以這就是傳輸超文字的協議。
- 第二它是一個屬於應用層的協議,什麼叫應用層,簡單說就是和應用程序互動 的層,想想應用裡面有什麼好互動的,當然是資料了,也就是說這一層解決的是如何包裝資料的,還是很像快遞。
所以簡單理解就把他當成快遞小哥就可以了。
特點
- C/S模式,快遞員服務於客戶。
- 簡單:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST,每種方法規定了客戶與伺服器聯絡的型別不同。就相當於告訴快遞員你的地址(路徑)和你要的運輸的方式(請求方法),比如我家住安卓小區你給我空運過來。。。
- 快速:由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
- 靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
- 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。但是這種方式在請求頻繁的條件下,將會在建立和斷開連線上花費大部分時間,所以在1.0、1.1持久連線變為了預設連線方式,有興趣的可以自己查一下這個方式。
- 無狀態:HTTP協議是無狀態協議,簡單說就是健忘、沒腦子。打電話給常年在小區送快遞的快遞小哥:“哥,還送老地方”,小哥:“你誰呀不認識!”,掛了。。。所以無狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
URL 格式
http://host[":"port][abs_path]
如:http://blog.csdn.net:80/qijinglai
http表示要通過HTTP協議來定位網路資源;host表示合法的Internet主機域名或者IP地址;port指定一個埠號,為空則使用預設埠80;abs_path指定請求資源的URI(Web上任意的可用資源)。
HTTP有兩種報文分別是請求報文和響應報文,快遞單(請求報文),單號查快遞(響應報文),讓我們先來看看請求報文。
請求報文
請求報文的一般格式:
對應上填快遞單就很好記了吧。
通常來說一個HTTP請求報文由請求行、請求報頭、空行、和請求資料4個部分組成。
請求行
請求行由請求方法,URL欄位和HTTP協議的版本組成,格式如下:
Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統一資源識別符號;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字元)。
HTTP請求方法有8種
- GET:請求獲取Request-URI所標識的資源
- POST:在Request-URI所標識的資源後附加新的資料
- HEAD:請求獲取由Request-URI所標識的資源的響應訊息報頭
- PUT: 請求伺服器儲存一個資源,並用Request-URI作為其標識
- DELETE :請求伺服器刪除Request-URI所標識的資源
- TRACE : 請求伺服器回送收到的請求資訊,主要用於測試或診斷
- CONNECT: HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
- OPTIONS :請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
例如我去訪問我的CSDN部落格地址請求行是:
GET http://blog.csdn.net/qijinglai HTTP/1.1
請求報頭
在請求行之後會有0個或者多個請求報頭,每個請求報頭都包含一個名字和一個值,它們之間用“:”分割。請求頭部會以一個空行傳送回車符和換行符來通知伺服器,以下不會有請求頭了。關於請求報頭,會在後面的訊息報頭一節做統一的解釋。
請求資料
請求資料在POST方法中使用。POST方法適用於需要客戶填寫表單的場景,與請求資料相關的最常用的請求頭是Content-Type和Content-Length。
響應報文
響應報文的一般格式:
HTTP的響應報文由狀態行、訊息報頭、空行、響應正文組成。響應報頭後面會講到,響應正文是伺服器返回的資源的內容,先來看看狀態行。
狀態行
狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。
狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
- 100~199:指示資訊,表示請求已接收,繼續處理
- 200~299:請求成功,表示請求已被成功接收、理解、接受
- 300~399:重定向,要完成請求必須進行更進一步的操作
- 400~499:客戶端錯誤,請求有語法錯誤或請求無法實現
- 500~599:伺服器端錯誤,伺服器未能實現合法的請求
常見的狀態碼如下:
- 200 OK:客戶端請求成功
- 400 Bad Request:客戶端請求有語法錯誤,不能被伺服器所理解
- 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden:伺服器收到請求,但是拒絕提供服務
- 500 Internal Server Error:伺服器發生不可預期的錯誤
- 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
例如訪問我的CSDN部落格地址響應的狀態行是:
HTTP/1.1 200 OK
訊息報頭
訊息報頭分為通用報頭、請求報頭、響應報頭、實體報頭等。訊息頭由鍵值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。
通用報頭,既可以出現在請求報頭,也可以出現在響應報頭中
Date:表示訊息產生的日期和時間
Connection:允許傳送指定連線的選項,例如指定連線是連續的,或者指定“close”選項,通知伺服器,在響應完成後,關閉連線
Cache-Control:用於指定快取指令,快取指令是單向的(響應中出現的快取指令在請求中未必會出現),且是獨立的(一個訊息的快取指令不會影響另一個訊息處理的快取機制)請求報頭,用於伺服器傳遞自身資訊的響應,常見的響應報頭:
Location:用於重定向接受者到一個新的位置,常用在更換域名的時候
Server:包含可伺服器用來處理請求的系統資訊,與User-Agent請求報頭是相對應的實體報頭,實體報頭用來定於被傳送資源的資訊,既可以用於請求也可用於響應。請求和響應訊息都可以傳送一個實體,常見的實體報頭為:
Content-Type:傳送給接收者的實體正文的媒體型別
Content-Lenght:實體正文的長度
Content-Language:描述資源所用的自然語言,沒有設定則該選項則認為實體內容將提供給所有的語言閱讀
Content-Encoding:實體報頭被用作媒體型別的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體型別,必須採用相應的解碼機制。
Last-Modified:實體報頭用於指示資源的最後修改日期和時間
Expires:實體報頭給出響應過期的日期和時間