天天看點

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

【正文】

在前兩篇文章中,我們學習到了和http相關的基礎知識。文章連結如下:

<a href="http://www.cnblogs.com/smyhvae/p/4004983.html" target="_blank">android系列之網絡(一)----使用httpclient發送http請求(通過get方法擷取資料)</a>

<a href="http://www.cnblogs.com/smyhvae/p/4005034.html" target="_blank">android系列之網絡(二)----http請求頭與響應頭</a>

一、get和post的對比:

在漫長的時間當中,其他的方法逐漸的退出了曆史舞台,最常用的隻剩下get和post方法。而之前已經講過了通過get方法擷取資料,今天來學習一下如何分别通過get和post擷取資料。

舉個例子:get類似于明信片,隻有請求頭,沒有請求體。而post類似于一封信,信封上的内容為請求頭;信裡面的内容為請求體(請求頭和請求體是分開的)。

含義如下:

get:通過請求uri得到資源。一般用于擷取/查詢資源資訊。

post:用于向伺服器送出新的内容。一般用于更新資源資訊。

主要差別如下:

get方法主要用于從伺服器取回資料,post用于向伺服器送出資料

get類似于明信片,隻有請求頭,沒有請求體;post類似于一封信,信封上的内容為請求頭;信裡面的内容為請求體

使用get方法啊向伺服器i教的資料量較小,通常不超過2k,使用post向伺服器送出的資料量通常沒有限制(明信片不能多寫,而寫信可以寫好多内容咧)

get請求是将所要送出的資料附在url之後,而post請求是将送出的資料放置在請求體當中

老羅在将到get和post請求的時候, 是這樣說的:

1、get是從伺服器上擷取資料,post是向伺服器傳送資料。

2、在用戶端, get方式在通過url送出資料,資料在url中可以看到;post方式,資料放置在html header内送出

3、對于get方式,伺服器端用request.querystring擷取變量的值,對于post方式,伺服器端用request.form擷取送出的資料。

4、get方式送出的資料最多隻能有1024位元組,而post則沒有此限制

5、安全性問題。正如在(2)中提到,使用 get 的時候,參數會顯示在位址欄上,而 post 不會。是以,如果這些資料是中文資料而且是非敏感資料,那麼使用 get ;如果使用者輸入的資料不是中文字元而且包含敏感資料,那麼還是使用 post為好

啰嗦了這麼多,對這段來個總結吧。

 【總結】

get/post請求的差別:

get請求方式:顯式請求方式,請求參數會在url上顯示,相對快,安全性較低,請求資料的大小一般不超過1kb。

post請求方式:隐式請求方式,請求參數将會在http請求的實體内容中進行傳輸,相對慢,安全性較高 ,請求資料的大小沒有限制

注:get請求方式和post請求差別在于請求參數在傳遞的過程中方式不同。

二、url的定義群組成:

url:uniform resource locator 統一資源定位符

url的組成部分:以http://www.mbalib.com/china/index.htm為例

http://:代表超文本傳輸協定

www:代表一個網際網路伺服器

mbalib.com/:伺服器的域名,或伺服器名稱

china/:子目錄,類似于我們的檔案夾

index.htm:是檔案夾中的一個檔案

/china/index.htm統稱為url路徑

三、使用tomcat軟體在本地搭建伺服器:

有了這個伺服器,就相當于在本地的計算機有了一個網站,然後我們可以通過浏覽器來通路這個網站。

下載下傳之後,将壓縮包解壓:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

注意目錄名不能有中文和空格。

軟體運作之前要保證環境變量已經配置:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

上圖中,變量名為java_home,變量值為:jdk安裝的絕對路徑。

回到tomcat的bin目錄中, 輕按兩下startup.bat:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

之後彈出如下界面:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

這個時候,本地的伺服器就已經搭建起來了。

首先檢視自己電腦的ip位址,我的計算機的ip位址為:192.168.1.112。

在浏覽器中輸入http://192.168.1.112:8080/。如果彈出如下界面,表示tomcat安裝成功并且啟動起來了:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

上方圖檔中,顯示我的tomcat的版本為:8.0.14。它的版本号是跟着jdk的版本走的,是以,建議jdk的版本為1.8。

我們現在在浏覽器上測試一下它吧:

首先在d:\apache-tomcat-8.0.14\webapps\root目錄中建立一個jsp檔案:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

jsp檔案中填入如下内容:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)
Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

現在我們随便起一個使用者名和密碼的賬号,比如使用者名smyhvae,密碼為smyh,然後在浏覽器中輸入如下内容:

http://192.168.1.112:8080/test.jsp?name=smyhvae&amp;password=smyh

輸入這個連結之後,回車,出現如下界面:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

上圖中表示,我們向伺服器發送這樣一個請求,連結中,問号前面的内容代表請求的路徑,問号後面是我們要傳送的參數(鍵是固定不變的,值是使用者自己填寫的),然後伺服器返還給我們這樣的資料。

四、使用get方法向伺服器發送資料:

我們在部落格“android系列之網絡(一)”中其實就已經通過get方法向伺服器擷取資料了,隻不過那篇文章中是通路百度首頁,然後擷取百度首頁的資料。現在我們要通過同樣的get方法,隻不過是換成了擷取本地伺服器搭建的網站資料。

隻需要稍微修改一下那篇文章中的代碼(代碼結構一樣,隻是換了另外一個連結)。完整版代碼如下:

activity_main.xml:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)
Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

mainactivity.java的代碼如下:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)
Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

上方代碼中,第73行就是我們所放入的url連結。運作程式後,輸入使用者名密碼,可以看到在背景列印出了我們所輸入的使用者名和密碼:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

五、使用post方法向伺服器發送資料:

上一段中,我們是通過get方法向伺服器發送資料,現在通過post方法向伺服器發送資料。布局檔案的代碼不變,就不寫了。mainactivity.java的代碼如下:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)
Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

上方代碼中,我們新開一個子線程,使用post方法向伺服器發送使用者名、密碼等資料。我們之前已經知道,使用get方法發送http請求有五大步驟,而如今換成post方法時,需要在第二步和第三步之間加入一些步驟(即上方加粗部分的代碼:116-127行),多的步驟其實是往請求對象中加入請求體。現在來詳細解釋一下這部分代碼:

我們通過namevaluepair集合來存放待送出的參數,并将這個參數集合傳入到一個urlencodedformentity當中(這個類的對象就代表了一個請求體,即鍵值對),然後将請求體放置在請求對象httppost當中。

程式運作後,輸入使用者名和密碼,點選按鈕,在背景列印出了之前輸入的使用者名密碼:

Android系列之網絡(三)----使用HttpClient發送HTTP請求(分别通過GET和POST方法發送資料)

現在我們總結一下post送出資料的步驟:

1. 構造請求對象;

2. 将需要傳遞給伺服器端的資料放置在鍵值對對象當中;

3. 将準備好的鍵值對放置在list當中;

4. 生成代表請求體的對象;

5. 将存有請求鍵值對的list對象放置在請求題對象當中;

6. 将請求體對象放置到請求對象當中;

7. 發送請求對象

後面的步驟(即處理請求對象)和get方法是一緻的。

上面兩段的例子,都是通過get和post往伺服器發送資料(在此,二者的作用是等價的)。需要注意的是,一般來講,get是從伺服器取資料,但在此例子中get卻是往伺服器發資料。如果是上傳檔案,就必須用post。我們将在今後的章節中講到。

繼續閱讀