向服務器提交數據有兩種方式,post和get。二者的區別主要有三點,安全性、長度限制、數據結構。其中get請求安全性相比較而言較差,數據長度受瀏覽器地址欄限制,沒有方法體。兩種都是較爲重要的數據提交方式。現簡單介紹一下三種post和get的提交方式。不管是哪一種方法實現post和get,get 的訪問路徑都要攜帶數據,而post提交是把數據放在方法體中。java
普通方法實現get/post提交: 瀏覽器
嚴格遵守Http協議進行數據傳輸。在安卓開發環境下,因爲主線程不能進行網絡訪問,所以須要在開啓一個子線程向服務器提交數據。爲了更加直觀的觀察數據,能夠在程序屏幕上顯示服務器反饋信息。又因爲子線程沒法更改UI界面,所以須要引入Hnndler代理器。實現get/post提交基本步驟就是,獲取URL路徑,根據路徑獲得Http鏈接,用HttpURLConnection對象設置相關的http配置信息、提交方式以及獲取反饋碼。當響應碼爲200時表示提交成功,能夠經過HttpURLConnection以流的形式獲取反饋信息。 安全
普通GRT提交方式:服務器
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq + "&pwd=" + pwd; new Thread() { public void run() { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); String result = StreamTools.ReadStream(is); Message msg = Message.obtain(); msg.what = SUCCESS; msg.obj = result; handler.sendMessage(msg); } else { Message msg = Message.obtain(); msg.what = ERROR1; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Message msg = Message.obtain(); msg.what = ERROR2; handler.sendMessage(msg); } } }.start(); }
普通POST提交方式:網絡
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload"; new Thread() { public void run() { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("POST"); conn.setReadTimeout(5000); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); String data = "qq="+URLEncoder.encode(qq,"utf-8")+"&pwd=" + URLEncoder.encode(pwd,"utf-8"); conn.setRequestProperty("Content-Length",String.valueOf(data.length())); conn.setDoOutput(true); conn.getOutputStream().write(data.getBytes()); int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); String result = StreamTools.ReadStream(is); Message msg = Message.obtain(); msg.what = SUCCESS; msg.obj = result; handler.sendMessage(msg); } else { Message msg = Message.obtain(); msg.what = ERROR1; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Message msg = Message.obtain(); msg.what = ERROR2; handler.sendMessage(msg); } } }.start(); }
用httpclien實現get/post提交的只須要一下幾個步驟:數據結構
1. 建立HttpClient對象,實現打開瀏覽器的功能 app
HttpClient client = new DefaultHttpClient(); 框架
2. 輸入地址或者數據 ,用到HttpGet()或HttpPost(),傳入要訪問的路徑,獲得HttpGet或HttpPost對象。ide
HttpGet httpGet = new HttpGet(path); post
3. 把得到的HttpGet或HttpPost對象發送到服務器,實現敲回車的功能,獲得HttpResponse對象。
HttpResponse response = client.execute(httpGet);
4. 獲得HttpResponse對象獲取狀態行中的狀態碼,判斷狀態碼狀態碼。
int code = response.getStatusLine().getStatusCode();
5. 一樣用HttpResponse對象獲取相應內容,存入流對象。最後將獲得的流對象轉爲字符串進行顯示。
InputStream is = response.getEntity().getContent();
其中要注意的一點是用post請求時要傳遞值因此要多出一個步驟。具體而言,先建立一個list集合,集合的泛型用NameValuePair表示,相似於鍵值對的形式存儲要傳遞的數據。接着向集合中添加要提交數據。最後用HttpPost對象把集合存入請求體中。
用HttpClient實現GET提交:
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq + "&pwd=" + pwd; new Thread() { public void run() { try { HttpClient client = new DefaultHttpClient(); HttpGet httpget = new HttpGet(path); HttpResponse response = client.execute(httpget); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); String result = StreamTools.ReadStream(is); Message msg = Message.obtain(); msg.what = SUCCESS; msg.obj = result; handler.sendMessage(msg); } else { Message msg = Message.obtain(); msg.what = ERROR1; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Message msg = Message.obtain(); msg.what = ERROR2; handler.sendMessage(msg); } } }.start(); }
用HttpClient實現POST提交:
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload"; new Thread() { public void run() { try { HttpClient client = new DefaultHttpClient(); HttpPost httppost = new HttpPost(path); List<NameValuePair> parameter = new ArrayList(); parameter.add(new BasicNameValuePair("qq", qq)); parameter.add(new BasicNameValuePair("pwd", pwd)); httppost.setEntity(new UrlEncodedFormEntity(parameter,"utf-8")); HttpResponse response = client.execute(httppost); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream is = response.getEntity().getContent(); String result = StreamTools.ReadStream(is); Message msg = Message.obtain(); msg.what = SUCCESS; msg.obj = result; handler.sendMessage(msg); } else { Message msg = Message.obtain(); msg.what = ERROR1; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Message msg = Message.obtain(); msg.what = ERROR2; handler.sendMessage(msg); } } }.start(); }
使用開源框架實現get/post提交:
利用框架實現get/post提交不須要再開啓子線程。直接在主線程進行get/post的提交,大大的減小了工做量。但操做前須要導包。而後直接建立一個AsyncHttpClient對象,用AsyncHttpClient對象的post方法和get方法,發送請求,並在AsyncHttpResponseHandler()對象中得到相應信息。一樣如果post請求,仍舊須要傳遞值。這裏能夠用RequestParams對象添加要傳遞的值。
在文件下添加jar包:
用開源框架實現GET提交:
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq + "&pwd=" + pwd; AsyncHttpClient client = new AsyncHttpClient(); client.get(path, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // TODO Auto-generated method stub tv_result.setText(new String(responseBody)); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // TODO Auto-generated method stub tv_result.setText("錯誤緣由:" + new String(responseBody)); } }); }
用開源框架實現POST請求:
public void load(View view){ final String qq = et_qq.getText().toString().trim(); final String pwd = et_pwd.getText().toString().trim(); if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) { Toast.makeText(MainActivity.this, "qq號或密碼爲空", 0).show(); return; } final String path = "http://192.168.1.114:8080/qqload/qqload"; AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.add("qq", qq); params.add("pwd", pwd); client.post(path,params,new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // TODO Auto-generated method stub tv_result.setText(new String(responseBody)); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // TODO Auto-generated method stub tv_result.setText(new String(responseBody)); } }); }
經過以上任何一種方式能夠實現的功能是,從安卓手機端提交數據到服務器端,服務器端進行判斷,並返回相應的結果。三種方式各有利弊,實現效果相同,在實際的使用過程當中能夠根據自己的須要進行選擇。