摘 要:在Android應(yīng)用程序開發(fā)中,經(jīng)常要提交數(shù)據(jù)到服務(wù)器,并從服務(wù)器獲取數(shù)據(jù)。文章主要介紹基于http協(xié)議提交數(shù)據(jù)到服務(wù)器,采用HttpClient提交數(shù)據(jù)到服務(wù)器,以及采用異步AsyncHttpClient框架提交數(shù)據(jù)到服務(wù)器。
關(guān)鍵詞:Http;HttpClient;AsyncHttpClient
在以http協(xié)議提交數(shù)據(jù)到服務(wù)器時(shí),最常用的就是GET和POST方式。GET方式會把用戶提交的數(shù)據(jù)添加到URL字符串的后面,這種方式提交數(shù)據(jù),不安全,且不能提交大量的數(shù)據(jù)。采用POST方式提交數(shù)據(jù)時(shí),則是把用戶提交的數(shù)據(jù)放在Http請求的數(shù)據(jù)體中,這種方式相對安全且能提交大量的數(shù)據(jù)。
采用Get方式提交數(shù)據(jù)到服務(wù)器示例代碼如下:
String path=\"192.168.0.100/web/LoginServer?name+\"+name;//定義提交的路徑,并向服務(wù)器提交一個(gè)名稱為name的字段。服務(wù)器應(yīng)有接受該字段的處理程序。注意的是path路徑不能寫成localhost或127.0.0.1,因?yàn)閍ndroid系統(tǒng)本身也是一個(gè)操作系統(tǒng),如果這樣寫,會指向模擬器本身
URL url=new URL(path);//把path封裝成URL對象
HttpURLConnection conn=(HttpURLConnection) url.openConnection();//建立連接
conn.setRequestMethod(\"GET\");//設(shè)置請求方式為GET
采用POST方式提交數(shù)據(jù)到服務(wù)器示例代碼如下:
String path=\"http://10.6.161.24:8080/web/LoginServlet\";//定義提交路徑
URL url=new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(\"POST\");//設(shè)置請求方式為POST
String date=\"name=\"+URLEncoder.encode(name);//準(zhǔn)備數(shù)據(jù)
conn.setRequestProperty(\"Content-Type\", \"application/x-www-form-urlencoded\");//設(shè)置請求數(shù)據(jù)類型
conn.setRequestProperty(\"Content-Length\", date.length()+\"\");//設(shè)置請求數(shù)據(jù)的長度
conn.setDoOutput(true);//允許向服務(wù)器寫數(shù)據(jù)
OutputStream os=conn.getOutputStream();//獲得輸出流
os.write(date.getBytes());//寫數(shù)據(jù)
HttpClient是向服務(wù)器交互的一個(gè)開源框架,google工程師也覺得該框架非常好用,所以把該框架直接集成到了android的SDK中,可以直接拿來用。用該框架向服務(wù)器提交數(shù)據(jù)的方式類似于我們用瀏覽器上網(wǎng),第一步先打開瀏覽器,第二步輸入地址,第三步敲擊回車。
采用HttpClient框架利用Get方式提交數(shù)據(jù)到服務(wù)器實(shí)例代碼如下:
HttpClient client=new DefaultHttpClient();//獲取HttpClient對象,類似與打開瀏覽器
String path=\"192.168.0.100/web/LoginServer?name+\"+name;
HttpGet httpGet=new HttpGet(path);//獲取HttpGet對象,采用get方式提交,類似于輸入地址
HttpResponse response=client.execute(httpGet);//提交數(shù)據(jù),類似于敲擊回車。
采用HttpClient框架利用Post方式提交數(shù)據(jù)到服務(wù)器實(shí)例代碼如下:
HttpClient client=new DefaultHttpClient();
String path=\"http://10.6.161.24:8080/web/LoginServlet\";
HttpPost post=new HttpPost(path);//獲取HttpPost對象,采用Post方式提交
List
parameters.add(new BasicNameValuePair(\"name\", name));
post.setEntity(new UrlEncodedFormEntity(parameters,));//設(shè)置要提交的數(shù)據(jù)
HttpResponse response=client.execute(post);
AsyncHttpClient是向服務(wù)器提交數(shù)據(jù)的另外一個(gè)框架,該框架是基于回掉機(jī)制的。采用異步提交的方式提交數(shù)據(jù)。在采用http協(xié)議或HttpClient框架提交數(shù)據(jù)的時(shí)候,由于連接服務(wù)器可能是非常耗時(shí)的操作,所以需要把連接服務(wù)器的代碼放在子線程中。而采用AsyncHttpClient方式時(shí)不用擔(dān)心這個(gè)問題。
采用AsyncHttpClient框架利用Get方式提交數(shù)據(jù)到服務(wù)器實(shí)例代碼如下:
AsyncHttpClient client=new AsyncHttpClient();//建立AsyncHtt
pClient的對象
String path=\"http://10.6.161.24:8080/web/LoginServlet?name=\"+name;//定義提交路徑
client.get(path, new AsyncHttpResponseHandler() {
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
//請求成功的處理代碼
};
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
//請求失敗的處理代碼
};
}
采用AsyncHttpClient框架利用Post方式提交數(shù)據(jù)到服務(wù)器實(shí)例代碼如下:
AsyncHttpClient client=new AsyncHttpClient();//建立AsyncHtt
pClient的對象
String path=\"http://10.6.161.24:8080/web/LoginServlet\";//定義提交路徑
RequestParams params=new RequestParams();
params.put(\"name\", name);
client.get(path, new AsyncHttpResponseHandler() {
public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
//請求成功的處理代碼
};
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
//請求失敗的處理代碼
};
}
從以上三種提交數(shù)據(jù)到服務(wù)器的方式不難看出,編程方式變得越來越簡單。其實(shí)HttpClient是對采用Http協(xié)議的封裝,而AsyncHttpClient又是對HttpClient的封裝。
參考文獻(xiàn)
[1]明日科技.Android從入門到精通[M].清華大學(xué)出版社,2012(9).
[2]張余.Android網(wǎng)絡(luò)開發(fā)從入門到精通[M].清華大學(xué)出版社,2014(1).
[3]李剛.瘋狂Android講義(第二版)[M].電子工業(yè)出版社,2013(3).
作者簡介:任星瑜,男,四川達(dá)州人,目前就讀于西北民族大學(xué),本科學(xué)歷,主要研究大數(shù)據(jù),物聯(lián)網(wǎng),數(shù)據(jù)挖掘。