Android網路程式設計要學的東西與Http協議學習


本節引言:

不知不覺終於來到Android網路程式設計這一章節,前面我們玩的都是單機,肯定是不過癮是吧, 本節開始我們來學習Android網路程式設計相關的一些東西:Android端網路程式設計要幹嘛? Http協議 的學習,使用自帶扣腳Json解析類別解析Json,XML解析的幾種常用方式,HttpUrlConnection和 HttpClient的使用,檔案的上傳,下載;WebService的使用,WebView,Socket通訊的使用等!

另外我們是客戶端,服務端的內容不在我們的範疇,而且小豬也不擅長,我們的最低要求是:能夠掌握獲取與解析伺服器回饋的資料的能力! 好的,話不多說,開始本節內容!


Android與網路互動的三種方式

1.png


#2.初識Http協定

實際開發中我們和服務端打交道一般用得都是基於Http協定的通信,所以學好Http協定是非常 重要的,當然,我們不用過於考究一些細節的東西,有個大體的了解即可!都是一些概念性的東西!


1)什麼是Http協定?

答案:hypertext transfer protocol(超文本傳輸協議),TCP/IP協議的一個應用層協議,用於 定義WEB瀏覽器與WEB伺服器之間交換資料的過程。客戶端連上web伺服器後,若想取得web伺服器 中的某個web資源,需遵守一定的通訊格式,HTTP協定用於定義客戶端與web伺服器通迅的格式。

2)Http 1.0 與 Http 1.1的區別

答案:1.0協議,客戶端與web伺服器建立連線後,只能取得一個web資源! 而1.1協議,允許客戶端與web伺服器建立連線後,在一個連線上取得多個web資源!

3)Http協定的底層工作流程:

答案:我們先要知道兩個名詞:

  • SYN (synchronous):TCP/IP建立連線時使用的握手訊號
  • ACK(Acknowledgement):確認字符,確認發來的資料已經接受無誤

#接著就到TCP/IP三次握手的概念:

  • 客戶端發送syn套件(syn = j)到伺服器,進入SYN_SEND狀態,然後等待伺服器確認
  • 伺服器收到syn包,確認客戶的syn(ack = j + 1),同時在自己也發送一個SYN包(syn=k), 即SYN + ACK包,伺服器進入SYN_RECV狀態
  • 客戶端收到SYN + ACK包,傳送確認包ACK(ack = k +1),傳送完後,客戶端與服務端 進入ESTABLISHED狀態,完成三次握手,然後兩者開始傳送資料

如果還不是很清晰,我們再來看三次握手的示意圖:

2.png

了解了是吧,然後我們就來看看Http操作的一個流程了:

  • 使用者點擊瀏覽器上的url(超連結) ,網頁瀏覽器與網頁伺服器建立連線
  • 建立連線後,客戶端傳送請求給伺服器,請求的格式為: 統一資源識別碼(URL)+協定版本號(一般是1.1)+MIME資訊(多個訊息標頭)+一個空行
  • 服務端收到請求後,給予對應的回傳訊息,回傳格式為: 協定版本號+ 狀態行(處理結果) + 多個訊息頭+ 空行+ 實體內容(例如傳回的HTML)
  • 客戶端接收服務端回傳訊息,透過瀏覽器顯示出來,然後與服務端斷開連線;當然如果中途 某步發生錯誤的話,錯誤訊息會回到客戶端,並顯示,例如:經典的404錯誤!

對於上面的流程如果還不清晰,我們可以使用HttpWatch或firefox抓下套件: PS:測試網站是小豬的學校的教務系統,輸入帳號密碼後請求登陸,我們可以看到下述訊息:

##HTTP請求包含的內容:

3.png

HTTP回應包含的內容:

4.png

#這就一目了然了吧!

4)Http協定的業務流程

5.png

5)Http的幾個請求方式

實際開發中我們用較多的方式是Get和Post,但實際開發可能還會用到其他請求方式,像是PUT, 小豬的實際專案中就用到了,下面為了方便大家,就把所有的請求方式列出來吧:

  • Get:請求獲取Request-URI所標識的資源
  • POST:在Request-URI所識別的資源後面附加新的資料
  • HEAD 請求取得由Request-URI所識別的資源的回應資訊報頭
  • PUT:請求伺服器儲存一個資源,並以Request-URI作為其識別
  • DELETE:請求伺服器刪除Request -URI所識別的資源
  • TRACE:請求伺服器回傳收到的請求訊息,主要用於測試或診斷
  • CONNECT:保留將來使用
  • OPTIONS:請求查詢伺服器的效能,或查詢與資源相關的選項
6)Get和Post的比較

用得最多的兩個,當然要做下對比啦!

  • GET:在請求的URL位址後面以?的形式帶上交給伺服器的數據,多個數據之間以&進行分隔, 但資料容量通常不能超過2K,例如:http://xxx?username=…&pawd=…這種就是GET
  • POST: 這個則可以在請求的實體內容中向伺服器發送數據,傳輸沒有數量限制
  • 另外要說一點,這兩個玩意都是發送數據的,只是發送機制不一樣,不要相信網上說的 "GET取得伺服器數據,POST傳送資料給伺服器"!!另外GET安全性非常低,Post安全性較高, 但是執行效率卻比Post方法好,一般查詢的時候我們用GET,資料增刪改的時候用POST! !

7)Http狀態碼合集

#當然,這些狀態碼只是要給參考,實際上決定權在伺服器端(後台的)手上,一個方案是請求後, 伺服器回給我們的是狀態,或是另一種,在應用不用弄多語言版本的時候最好用,直接返回 一串結果資訊的Json給我們,我們直接顯示就好,這樣可以偷懶不少!以下列下狀態碼合集,參考 下就好:

  • 100~199 : 成功接受請求,客戶端需提交下次請求才能完成整個處理過程
  • 200: OK,客戶端請求成功
  • 300~399:請求資源已移到新的位址(302,307,304)
  • 401:請求未授權,改狀態碼需與WWW-Authenticate標頭域一起使用
  • #403: Forbidden,伺服器收到請求,但是拒絕提供服務
  • 404:Not Found,請求資源不存在,這個就不用說啦
  • 500:Internal Server Error,伺服器發生不可預期的錯誤
  • 503:Server Unavailable,伺服器目前無法處理客戶端請求,一段時間後可能恢復正常

8)Http協定的特性

#概念性的東西,知道就好,別去背,百度百科的東西,直接複製貼上:

1. 支援客戶/伺服器模式

2. 簡單快速:當客戶向伺服器要求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、 HEAD、POST。每種方法規定了客戶與伺服器聯繫的類型不同。 由於HTTP協定簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。

3. 靈活:HTTP允許傳輸任意類型的資料物件。正在傳輸的類型由Content-Type加以標記。

4. 無連線:無連線的意義是限制每次連線只處理一個請求。伺服器處理完客戶的請求, 並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。

5. 無狀態:HTTP協定是無狀態協定。無狀態是指協議對於事務處理沒有記憶能力。 缺少狀態意味著如果後續處理需要前面的訊息,則它必須重傳,這可能導致每個連接傳送的資料量增加。另一方面,在伺服器不需要先前資訊時它的應答就較快。

PS:關於OSI七層協定以及TCP四層模型就不在基礎系列講解了~有興趣可以自行了解!


本節小結:

本節說明了我們在Android開發中涉及到網路方面的要完成的工具,以及講解了Http協定的 相關概念,相信大家對Android行動端與伺服器互動已經有了個模糊的映像,下節我們來研究 Http協定的請求頭與回應頭!本節就到這裡,謝謝~

#