瞿 蘇
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院揚州商務(wù)分院 信息電子系,江蘇 揚州 225000)
基于Android的網(wǎng)絡(luò)編程探討
瞿 蘇
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院揚州商務(wù)分院 信息電子系,江蘇 揚州 225000)
分析了在Android中利用HttpURLConnection和HttpClient通信方式訪問網(wǎng)絡(luò)的方法,并給出了實現(xiàn)代碼.
HttpURLConnection;HttpClient;GET;POST
Google公司以網(wǎng)絡(luò)搜索引擎起家,經(jīng)過大膽的創(chuàng)意和不斷的努力,目前已經(jīng)成為網(wǎng)絡(luò)世界的巨頭之一.出自于Google之手的Android平臺,在運用網(wǎng)絡(luò)編程上也非常優(yōu)秀.隨著智能手機和平板電腦等移動終端設(shè)備的迅速發(fā)展,Internet已經(jīng)不再只是傳統(tǒng)的有線互聯(lián)網(wǎng),還包括移動互聯(lián)網(wǎng).同有線互聯(lián)網(wǎng)一樣,移動互聯(lián)網(wǎng)也可以采用HTTP(超文本傳輸協(xié)議)訪問網(wǎng)絡(luò).在Android中,網(wǎng)絡(luò)通信的方法包括HttpURLConnection和HttpClient.
Java.net包中包含HttpURLConnection抽象類,需要使用URL的openConnection()方法來獲得,用于發(fā)送HTTP請求和獲取HTTP響應(yīng).例如,要創(chuàng)建http://www.baidu.com網(wǎng)站對應(yīng)的HttpURLConnection對象,可以使用下面的代碼:
URL url=new URL(http://www.baidu.com/);
HttpURLConnection urlconnection=(HttpURLConnection)url.openConnection();
其中, openConnection()方法創(chuàng)建了HttpURLConnection對象,可設(shè)置連接超時的時間和請求方式等屬性.創(chuàng)建好對象后,即可使用HTTP請求.HTTP請求分為GET請求和POST請求[1].
(1)發(fā)送GET請求
使用對象發(fā)送請求時,默認(rèn)發(fā)送的是GET請求.因此,發(fā)送GET請求比較簡單,只需要在指定連接地址時,先將要傳遞的參數(shù)通過“?參數(shù)名=參數(shù)值”進行傳遞,然后獲取輸入流中的數(shù)據(jù),并關(guān)閉連接即可.要實現(xiàn)向服務(wù)器發(fā)送GET請求并獲取服務(wù)器的響應(yīng)結(jié)果,在程序編寫時,需要有一個無返回值的send()方法,用于建立一個HTTP連接,并將輸入的內(nèi)容發(fā)送到Web服務(wù)器上,再讀取服務(wù)器的處理結(jié)果.Send()方法代碼如下:
public void send() {
String target="";
target = "http://192.168.1.66:8081/blog/index.jsp?content="
+Base64(content.getText().toString().trim());//要訪問的URL地址
URL;
try {
url = new URL(target);
HttpURLConnection urlConn = (HttpURLConnection) url
openConnection();//創(chuàng)建一個HTTP連接
InputStreamReader in = new InputStreamReader(
urlConn.getInputStream()); // 獲得讀取的內(nèi)容
BufferedReader buffer = new BufferedReader(in); // 獲取輸入流對象
String inputLine = null;
//通過循環(huán)逐行讀取輸入流中的內(nèi)容
while ((inputLine = buffer.readLine()) != null) {
result += inputLine + " ";
}
in.close(); //關(guān)閉字符輸入流對象
urlConn.disconnect(); //斷開連接
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
注意,用GET請求方法傳遞中文參數(shù)時,會產(chǎn)生亂碼.要解決亂碼問題,可以采用Base64()方法[2],或者使用Java提供的URLEncoder類.
//對字符串進行Base64編碼
public String Base64(String content){
try {
content=Base64.encodeToString(content.getBytes("utf-8"),Base64.DEFAULT);//對字符串進行Base64編碼
content=URLEncoder.encode(content);//對字符串進行URL編碼
} catch (UnsupportedEncodingException e) {
e.printStackTrace(); //輸出異常信息
}
return content;
}
(2)發(fā)送POST請求
對于1024字節(jié)以內(nèi)的數(shù)據(jù)采用GET方式發(fā)送請求,而對于較大數(shù)據(jù)則采用POST方式發(fā)送請求.Android中,GET是默認(rèn)的發(fā)送請求方式,而發(fā)送POST請求時,需對其進行指定.例如,創(chuàng)建一個HTTP連接,并為該連接指定請求的發(fā)送方式為POST,可以使用下面的代碼:
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
urlConn.setRequestMethod(“POST”);
這兩句表示的是,創(chuàng)建一個HTTP連接并指定請求方式為POST.
與發(fā)送GET請求相比,發(fā)送POST請求較復(fù)雜,需通過HttpURLConnection類及其父類URLConnection提供的方法設(shè)置相關(guān)的內(nèi)容,如表1所示.
表1 發(fā)送POST請求時常用的方法
訪問某個簡單頁面可以使用HttpURLConnection類,而對于比較復(fù)雜的聯(lián)網(wǎng)操作,可以使用Apache組織提供的HttpClient類訪問網(wǎng)絡(luò),HttpClient封裝了Java提供的訪問網(wǎng)絡(luò)的方法,如輸入/輸出流操作被統(tǒng)一封裝成HttpGet,HttpPost和HttpResponse三類,分別代表發(fā)送GET請求、發(fā)送POST請求和處理響應(yīng)的對象[3].HttpClient發(fā)送HTTP請求有兩種形式.
(1)發(fā)送GET請求
HttpClient發(fā)送GET請求可分為以下幾步:第一步,創(chuàng)建HttpClient對象和HttpGet對象;第二步,將要發(fā)送的參數(shù)連接到URL地址中,調(diào)用HttpGet的setParams()方法來添加請求參數(shù);第三步,添加請求參數(shù)后,通過execute()方法發(fā)送請求,并返回一個HttpResponse對象;第四步,調(diào)用HttpResponse的getEntity()方法來獲得HttpEntity對象中服務(wù)器的響應(yīng)內(nèi)容.
(2)發(fā)送POST請求
POST方式用于復(fù)雜的請求數(shù)據(jù),和HttpURLconnection類的POST請求一樣.使用HttpClient發(fā)送POST請求可分為以下幾步:首先,創(chuàng)建HttpClient對象和HttpPost對象;其次,調(diào)用HttpPost的setParams()方法添加請求參數(shù),與此同時,用setEntity()方法來設(shè)置請求參數(shù);再次,添加請求參數(shù)后,調(diào)用HttpClient對象的execute()方法發(fā)送請求,并返回一個HttpResponse對象;最后,調(diào)用HttpResponse的getEntity()方法獲取HttpEntity對象中服務(wù)器的響應(yīng)內(nèi)容.在程序編寫時,需要編寫一個無返回值的send(),用于建立一個使用POST請求方式的HTTP連接,并將輸入的昵稱和微博內(nèi)容發(fā)送到Web服務(wù)器上,再讀取服務(wù)器處理的結(jié)果[4].Send()方法的代碼如下:
public void send() {
String target = "http://192.168.1.66:8081/blog/deal_httpclient.jsp";//要提交的目標(biāo)地址
HttpClient httpclient = new DefaultHttpClient();//創(chuàng)建HttpClient對象
HttpPost httpRequest = new HttpPost(target);//創(chuàng)建HttpPost對象
//將要傳遞的參數(shù)保存到List集合中
List
params.add(new BasicNameValuePair("param", "post"));//標(biāo)記參數(shù)
params.add(new BasicNameValuePair("nickname", nickname.getText().toString()));//昵稱
params.add(new BasicNameValuePair("content", content.getText().toString()));//內(nèi)容
try {
httpRequest.setEntity(new UrlEncodedFormEntity(params, "utf-8"));//設(shè)置編碼方式
HttpResponse httpResponse = httpclient.execute(httpRequest); //執(zhí)行HttpClient請求
if (httpResponse.getStatusLine().getStatusCode() ==HttpStatus.SC_OK){//如果請求成功
result += EntityUtils.toString(httpResponse.getEntity());//獲取返回的字符串
}else{
result = "請求失??!";
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();//輸出異常信息
} catch (ClientProtocolException e) {
e.printStackTrace();//輸出異常信息
} catch (IOException e) {
e.printStackTrace();//輸出異常信息
}
}
本文主要介紹了如何利用Android中的HttpURLConnection和HttpClient訪問網(wǎng)絡(luò).訪問簡單頁面提交請求并獲取服務(wù)器的響應(yīng)可以使用HttpURLConnection,而對于復(fù)雜的聯(lián)網(wǎng)頁面,需使用HttpClient來實現(xiàn).HTTP請求分為GET請求和POST請求,GET請求方式適合發(fā)送1024字節(jié)以內(nèi)的數(shù)據(jù),POST方式則可以發(fā)送較大的數(shù)據(jù).
[1] 王寅峰,許志良.AppInventor實踐教程:Android智能應(yīng)用開發(fā)前傳[M].北京:電子工業(yè)出版社,2013:210-230.
[2] 吳杰,梁妍.基于實驗案例分解和重構(gòu)的Android網(wǎng)絡(luò)編程教學(xué)改革探索[J].信息技術(shù)與信息化,2016(5):103-104.
[3] 王向輝.可視化開發(fā)Android應(yīng)用程序——拼圖開發(fā)模式App Inventor[M].北京:清華大學(xué)出版社,2013:231-253.
[4] 明日科技.Android從入門到精通[M].北京:清華大學(xué)出版社,2015:413-435.
責(zé)任編輯:金 欣
The Android-based network programming
QU Su
(Department of Information Technology, Yangzhou Business Branch of Jiangsu Union Technical Institute, Yangzhou, Jiangsu 225000, China)
This paper analyzes the method of using HttpURLConnection and HttpClient communication in access to the network in Android, and realizes the implementation code.
HttpURLConnection;HttpClient; GET; POST
2016-10-08
瞿 蘇(1982-),女,江蘇揚州人,江蘇聯(lián)合職業(yè)技術(shù)學(xué)院揚州商務(wù)分院講師,碩士,研究方向:計算機應(yīng)用技術(shù).
1009-4873(2016)06-0067-03
TP311.52
:A