1. 程式人生 > >Android中post和get的提交方式【三種】

Android中post和get的提交方式【三種】

向伺服器提交資料有兩種方式,post和get。兩者的區別主要有三點,安全性、長度限制、資料結構。其中get請求安全性相比較而言較差,資料長度受瀏覽器位址列限制,沒有方法體。兩種都是較為重要的資料提交方式。現簡單介紹一下三種post和get的提交方式。無論是哪種方法實現post和get,get 的訪問路徑都要攜帶資料,而post提交是把資料放在方法體中。

普通方法實現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物件,實現開啟瀏覽器的功能

 HttpClient client = new DefaultHttpClient();

2.輸入地址或者資料 ,用到HttpGet()或HttpPost(),傳入要訪問的路徑,得到HttpGet或HttpPost物件。

 HttpGet  httpGet = new HttpGet(path);

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));
   }
  });
 }

通過以上任何一種方式可以實現的功能是,從安卓手機端提交資料到伺服器端,伺服器端進行判斷,並返回相應的結果。三種方式各有利弊,實現效果相同,在實際的使用過程中可以根據本身的需要進行選擇。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支援指令碼之家!