天天看點

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

【正文】 

一、http協定初探:

http(hypertext transfer protocol)中文 “超文本傳輸協定”,是一種為分布式,合作式,多媒體資訊系統服務,面向應用層的協定,是internet上目前使用最廣泛的應用層協定,它基于傳輸層的tcp協定進行通信,http協定是通用的、無狀态的協定。

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

這幾個名詞有一種通俗的解釋:

通訊協定:雙方對話的标準

通用的:用了都說好,誰用誰知道

無狀态的:翻臉不認人

超文本:除了文本,還可以是音頻、視訊

http協定與android開發之間的關系:

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

http協定的學習重點:

http協定基礎概念、

請求響應模型、

送出請求的不同方法、

響應狀态判斷、

擷取響應以及解析響應、

資料下載下傳的實作方法、

資料上傳的實作方法、

請求頭詳細内容、

響應頭詳細内容等

關于http協定的學習,推薦兩個連結:

<a href="http://www.cnblogs.com/plokmju/p/java-http.html" target="_blank">http://www.cnblogs.com/tankxiao/archive/2012/02/13/2342672.html</a>

<a href="http://blog.csdn.net/gueter/article/details/1524447" target="_blank">http://blog.csdn.net/gueter/article/details/1524447</a>

二、http協定概念:

1、http協定定義:

www是以internet作為傳輸媒介的一個應用系統,www網上基本的傳輸機關是web網頁。www的工作是基于客戶機/伺服器計算模型,由web浏覽器和web伺服器構成,兩者之間采用超文本傳輸協定http進行通信。

http協定時基于tcp/ip協定之上的協定,是web浏覽器和web伺服器之間的應用層的協定,是通用的、無狀态的面向對象的協定。 

如果要實作網絡互聯我們要思考兩個需要解決的技術問題:

第一:浏覽器和伺服器是通過什麼來連接配接的。

第二:這種連接配接方式是怎麼實作的。

通過internet去發送到伺服器當中,而internet内部可以通過三種方式來實作發送資訊和資料:

第一種:http協定,也是在工作中最常用的,是建立在tcp/ip基礎上實作的。

第二種:ftp協定

第三種:tcp/ip協定,它也是最底層的協定,其它的方式必須是要通過它,但是要想實作這種協定必須要實作socket程式設計,這種方法是用來上傳一些比較大的檔案,視訊,進行斷點續傳的操作。

2、用戶端連接配接伺服器實作内部的原理如下:

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

分析上圖,步驟如下:

第一步:在浏覽器用戶端中得到使用者輸入的内容。 

第二步:浏覽器得到這個網址之後,内部會将這個域名發送到dns上,進行域名解析。得到它的ip之後就會連結到指定的伺服器上,假如伺服器的位址是:221.104.13.32:80,從浏覽器到伺服器端口它使用到最底層的tcp/ip協定。 

第三步:實作tcp/ip協定用socket來完成,使用了socket的套接字。 

第四步:伺服器端的80端口監聽用戶端的連結,這樣用戶端到伺服器就連結上了。

伺服器接收到這些内容之後,并按照這些請求的路徑找到對應的頁面,進一步找到對應的網頁内容,傳回給用戶端。

通俗一點講,使用者在浏覽器輸入網址,通過http協定發出去,網址經過dns域名解析,解析成指定的ip位址,并在80端口上監聽使用者的請求。伺服器監聽到請求之後,會以三種方式傳回給用戶端:html、xml、jason。

http傳回請求資料的三種方式:

1、以html代碼内容傳回。 

2、以xml字元串的形式傳回,在以後的android開發中這種形式傳回資料比較多。 

3、以json對象形式傳回,在網絡流量上考慮json要比xml方式要好一些,便于解析。

在android當中,一般使用xml和json資料解析。

三、使用http協定通路網絡:

android中的webview控件已經在背景幫我們處理好了發送http請求、接收服務響應、解析傳回資料,以及最終的頁面展示這幾步工作,不過由于它封裝得太好了,反而不能直覺地看出http協定是如何工作的。是以接下來我們通過手動發送http請求的方式,來更加深入的了解這一過程。

在android上發送http請求的方式一般有兩種:httpurlconnection和httpcient。我們先來學習httpcient。

四、httpcient:

httpclient是apache開源組織提供的http網絡通路接口(一個開源的項目),從名字上就可以看出,它是一個簡單的http用戶端(并不是浏覽器),可以發送http請求,接受http響應。但是不會緩存伺服器的響應,不能執行http頁面中簽入嵌入的js代碼,自然也不會對頁面内容進行任何解析、處理,這些都是需要開發人員來完成的。

httpclient其實是一個interface類型,httpclient封裝了對象需要執行的http請求、身份驗證、連接配接管理和其它特性。既然httpclient是一個接口,是以無法建立它的執行個體。從文檔上看,httpclient有三個已知的實作類分别是:abstracthttpclient, androidhttpclient, defaulthttpclient,會發現有一個專門為android應用準備的實作類androidhttpclient,當然使用正常的defaulthttpclient也可以實作功能。

從兩個類包所有在位置就可以看出差別,androidhttpclient定義在android.net.http.androidhttpclient包下,屬于android原生的http通路,而defaulthttpclient定義在org.apache.http.impl.client.defaulthttpclient包下,屬于對apche項目的支援。而androidhttpclient沒有公開的構造函數,隻能通過靜态方法newinstance()方法來獲得androidhttpclient對象。

簡單來說,用httpclient發送請求、接收響應都很簡單,隻需要五大步驟即可:(要牢記)

建立代表用戶端的httpclient對象。

建立代表請求的對象,如果需要發送get請求,則建立httpget對象,如果需要發送post請求,則建立httppost對象。注:對于發送請求的參數,get和post使用的方式不同,get方式可以使用拼接字元串的方式,把參數拼接在url結尾;post方式需要使用setentity(httpentity entity)方法來設定請求參數。

調用httpclient對象的execute(httpurirequest request)發送請求,執行該方法後,将獲得伺服器傳回的httpresponse對象。伺服器發還給我們的資料就在這個httpresponse相應當中。調用httpresponse的對應方法擷取伺服器的響應頭、響應内容等。

檢查相應狀态是否正常。伺服器發給用戶端的相應,有一個相應碼:相應碼為200,正常;相應碼為404,用戶端錯誤;相應碼為505,伺服器端錯誤。

獲得相應對象當中的資料

五、defaulthttpclient:

根據上面的五大步驟,我們就拿defaulthttpclient舉例來通路網絡。注意這裡有一條原則:在主線程中不能通路網絡(在android4.0之後的加入的概念)。

【執行個體】點選按鈕,擷取百度首頁的文本内容

建立工程檔案m04_http01。完整版代碼如下:

首先是布局檔案,雖然比較簡單,但還是貼上吧。

activity_main.xml代碼如下:

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)
Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

布局檔案中,我們用一個scrollview來包裹textview。借助scrollview控件的話,就可以允許我們一滾動的形式檢視螢幕外i的那部分内容。

mainactivity.java的代碼如下:(注釋比較詳細)

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)
Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

大緻流程如下:

這裡,我們添加了一個sendrequestwithhttpclient()方法(第63行),并在點選事件中去調用這個方法。在這個方法中,先開啟了一個子線程。

69至81行:在子線程中使用httpclient發出一條http請求,請求的目标位址是百度的首頁。

83至87行:為了能讓結果在界面上顯示出來,将伺服器傳回的資料放到了message對象中,并用handler将message發出去。

需要注意的是:

第80行的entity就是伺服器發還給用戶端的資料。

最後要記得在清單檔案中聲明通路網絡的權限:

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)
Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

程式運作後,點選按鈕,顯示結果如下:

Android系列之網絡(一)----使用HttpClient發送HTTP請求(通過get方法擷取資料)

伺服器傳回給我們的就是這種html代碼,隻是通常情況下浏覽器都會将這些代碼解析成漂亮的網頁後再展示出來。