天天看點

Android http

浏覽器與網站互動 首先建立連接配接,浏覽器向網站發送請求,網站響應請求(并傳回請求内容),浏覽器關閉連接配接。

請求可以不帶參數也可以帶參數。如 ​​http://www.baidu.com​​​ 沒有帶參數。​​http://www.baidu.com/s?word=java&tn=site888_pg&lm=-1​​ 則是帶參數

帶參數的可以用 get方法發送,也可以用post 方式發送。

GET請求的資料會附在URL之後(就是把資料放置在HTTP協定頭中),以?分割URL和傳輸資料,參數之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果資料是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字元串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符号以16進制表示的ASCII。

POST把送出的資料則放置在是HTTP包的包體中。

代碼示例:

package com.urlconnecttest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

  private TextView tv;
  private Button btn;
  private HttpResponse httpResponse = null;
  private HttpEntity httpEntity = null;

  private final String baseUrl = "http://www.baidu.com/";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setTitle("擷取網站傳回資源");
    init();
  }

  public void init() {

    tv = (TextView) findViewById(R.id.tv);
    btn = (Button) findViewById(R.id.btn);

    btn.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        System.out.println("--- click! ---");

        new Thread(new Runnable() {

          @Override
          public void run() {
            // TODO Auto-generated method stub
            getRes();
          }
        }).start();
      }
    });
  }

  // get 方法測試
  public void getTest() {

    String url = baseUrl + "?" + "name=1&&age=20";
    HttpGet httpGet = new HttpGet(baseUrl);
    HttpClient httpClient = new DefaultHttpClient();
    InputStream is = null;
    try {
      httpResponse = httpClient.execute(httpGet);
      httpEntity = httpResponse.getEntity();

      BufferedReader br = new BufferedReader(new InputStreamReader(
          httpEntity.getContent()));
      String result = null;
      String line = null;
      while ((line = br.readLine()) != null) {
        result += line;
      }
      System.out.println("--- result: " + result + " ---");

    } catch (Exception e) {
      // TODO: handle exception
    }

    finally {
      try {
        is.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }

  }

  public void postTest() {//Post 方法測試

    String name = "zhangsan";
    String age = "20";

    NameValuePair nameValuePair1 = new BasicNameValuePair("name", name);
    NameValuePair nameValuePair2 = new BasicNameValuePair("age", age);
    List<NameValuePair> list = new ArrayList<NameValuePair>();
    list.add(nameValuePair1);
    list.add(nameValuePair2);

    InputStream is = null;
    try {
      httpEntity = new UrlEncodedFormEntity(list);
      HttpPost httpPost = new HttpPost(baseUrl);
      HttpClient httpClient = new DefaultHttpClient();
      httpResponse = httpClient.execute(httpPost);
      httpEntity = httpResponse.getEntity();
      is = httpEntity.getContent();
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      String result = null, line = null;
      while ((line = br.readLine()) != null) {

        result += line;
      }
      System.out.println("--- result: " + result + " ---");

    } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    finally {
      try {
        is.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

  public void getRes() {

    // 生成一個請求對象
    HttpGet httpGet = new HttpGet(baseUrl);
    // 生成一個http用戶端對象
    HttpClient httpClient = new DefaultHttpClient();
    // 用http用戶端發送請求對象
    InputStream is = null;
    try {
      httpResponse = httpClient.execute(httpGet);
      httpEntity = httpResponse.getEntity();
      is = httpEntity.getContent();
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      String result = null;
      String line = null;
      while ((line = br.readLine()) != null) {
        result += line;
      }

      System.out.println("--- result: " + result + " ---");
    } catch (ClientProtocolException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    finally {
      try {
        is.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

}      

android 網絡程式設計 HttpGet類和HttpPost類使用詳解

内容來源于《人人都玩開心網》一書

        雖然在登入系統中使用了Web Service與服務端進行互動。但是在傳遞大量的數量時,Web Service顯得有些笨拙。在本節将介紹移動電子相冊中使用的另外一種與資料庫互動的方法。直接發送HTTP GET或POST請求。這就要用到HttpGet、HttpPost以及HttpURLConnection這些類。

15.3.1  HttpGet類和HttpPost類

本節将介紹Android SDK內建的Apache HttpClient子產品。要注意的是,這裡的Apache HttpClient子產品是HttpClient 4.0(org.apache.http.*),而不是Jakarta Commons HttpClient 3.x(org.apache.commons.httpclient.*)。

在HttpClient子產品中用到了兩個重要的類:HttpGet和HttpPost。這兩個類分别用來送出HTTP GET和HTTP POST請求。為了測試本節的例子,需要先編寫一個Servlet程式,用來接收HTTP GET和HTTP POST請求。讀者也可以使用其他服務端的資源來測試本節的例子。

假設192.168.17.81是本機的IP,用戶端可以通過如下的URL來通路服務端的資源:

​​http://192.168.17.81:8080/querybooks/QueryServlet?bookname=開發​​

在這裡bookname是QueryServlet的請求參數,表示圖書名,通過該參數來查詢圖書資訊。

現在我們要通過HttpGet和HttpPost類向QueryServlet送出請求資訊,并将傳回結果顯示在TextView元件中。

無論是使用HttpGet,還是使用HttpPost,都必須通過如下3步來通路HTTP資源。

1.建立HttpGet或HttpPost對象,将要請求的URL通過構造方法傳入HttpGet或HttpPost對象。

2.使用DefaultHttpClient類的execute方法發送HTTP GET或HTTP POST請求,并傳回HttpResponse對象。

public void onClick(View view)  
{  
    //  讀者需要将本例中的IP換成自己機器的IP  
    String url = "http://192.168.17.81:8080/querybooks/QueryServlet";  
    TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);  
    EditText etBookName = (EditText) findViewById(R.id.etBookName);  
    HttpResponse httpResponse = null;  
    try  
    {  
        switch (view.getId())  
        {  
            //  送出HTTP GET請求  
            case R.id.btnGetQuery:  
                //  向url添加請求參數  
                url += "?bookname=" + etBookName.getText().toString();  
                //  第1步:建立HttpGet對象  
                HttpGet httpGet = new HttpGet(url);  
                //  第2步:使用execute方法發送HTTP 
 GET請求,并傳回HttpResponse對象                  httpResponse = new DefaultHttpClient().execute(httpGet);  
                //  判斷請求響應狀态碼,狀态碼為200表
 示服務端成功響應了用戶端的請求                  if (httpResponse.getStatusLine().
 getStatusCode() == 200)                  {  
                    //  第3步:使用getEntity方法獲得傳回結果  
                    String result = EntityUtils.
 toString(httpResponse.getEntity());                      //  去掉傳回結果中的"\r"字元,
 否則會在結果字元串後面顯示一個小方格                      tvQueryResult.setText(result.replaceAll("\r", ""));  
                }  
                break;  
            //  送出HTTP POST請求  
            case R.id.btnPostQuery:  
                //  第1步:建立HttpPost對象  
                HttpPost httpPost = new HttpPost(url);  
                //  設定HTTP POST請求參數必須用NameValuePair對象  
                List<NameValuePair> params = new 
 ArrayList<NameValuePair>();                  params.add(new BasicNameValuePair
 ("bookname", etBookName.getText(). toString()));                  //  設定HTTP POST請求參數  
                httpPost.setEntity(new 
 UrlEncodedFormEntity(params, HTTP.UTF_8));                  //  第2步:使用execute方法發送HTTP 
 POST請求,并傳回HttpResponse對象                  httpResponse = new DefaultHttpClient().
 execute(httpPost);                  if (httpResponse.getStatusLine().
 getStatusCode() == 200)                  {  
                    //  第3步:使用getEntity方法獲得傳回結果  
                    String result = EntityUtils.toString
 (httpResponse.getEntity());                      //  去掉傳回結果中的"\r"字元,
 否則會在結果字元串後面顯示一個小方格                      tvQueryResult.setText(result.replaceAll("\r", ""));  
                }  
                break;  
        }  
    }  
    catch (Exception e)  
    {  
        tvQueryResult.setText(e.getMessage());  
    }