深入Android通過Apache HTTP訪問HTTP資源

fmms 12年前發布 | 58K 次閱讀 Android Android開發 移動開發

HttpClient接口

實現類:DefaultHttpClient這也是常用的一個用于實現HttpClient接口的子類,

HttpClietnt中定義的常用抽象方法

方法名稱

描述

public abstract HttpResponse execute (HttpUriRequest request)

通過HttpUriRequest對象執行返回一個HttpResponse對象

public abstract HttpResponse execute (HttpUriRequest request, HttpContext context)

通過HttpUriRequest對象和HttpContext對象執行返回一個HttpResponse對象

 

HttpResponse接口

HttpResponse接口里定義了一系列的set、get方法

方法名稱

描述

public abstract HttpEntity getEntity ()

得到一個HttpEntity對象

public abstract StatusLine getStatusLine ()

得到一個StatusLine(也就是HTTP協議中的狀態行我們知道HTPP狀態行由三部分組成:HTTP協議版本,服務器發回的響應狀態代碼,狀態碼的文本描述)接口的實例對象

public abstract Locale getLocale ()

得到Locale對象

….相應的set方法

 

 

StatusLine接口

StatusLine接口的常用方法。也可以通過其實現的子類BasicStatusLine類里查看

方法名稱

描述

public abstract ProtocolVersion getProtocolVersion ()

得到一個ProtolVersion對象它是一個HTTP版本的封裝類,在這個類里定義了一系列的方法我們可以通過它的getProtocol方法取得協議名稱,getMinor得到HTPP協議的版本

public abstract String getReasonPhrase ()

狀態碼的文本描述

public abstract int getStatusCode ()

得到響應狀態碼

 

 

HttpEntity接口

HttpEntity是一個接口

方法名稱

描述

public abstract InputStream getContent ()

得到一個輸入流對象,我們可以用這個流來操作文件(例如保存文件到SD卡)

public abstract Header getContentType ()

得到Content-Type信息頭

public abstract Header getContentEncoding ()

得到Content-Encoding信息頭

 

我們可以通過EntityUtils類,它是一個final類,一個專門針對于處理HttpEntity的幫助類

常用方法

EntityUtils類

EntityUtils類的常用方法

方法名稱

描述

public static String getContentCharSet (HttpEntity entity)

設置HttpEntity對象的ContentCharset

public static byte[] toByteArray (HttpEntity entity)

將HttpClient轉換成一個字節數組

public static String toString (HttpEntity entity, String defaultCharset)

通過指定的編碼方式取得HttpEntity里字符串內容

public static String toString (HttpEntity entity)

取得HttpEntity里字符串內容

 

NameValuePair

NameValuePair接口是一個簡單的封閉的鍵值對,只提供了一個getName()和一個getValue方法。主要用到的實現類BasicNameVaulePair

 

HttpGet類

HttpGet它實現了HttpRequest、HttpUriRequest接口

構造方法

方法名稱

描述

public HttpGet ()

無參數構造方法用以實例化對象

public HttpGet (URI uri)

通過URI對象構造HttpGet對象

public HttpGet (String uri)

通過指定的uri字符串地址構造實例化HttpGet對象

 

HttpPost類

同樣它也實現了HttpRequest、HttpUriRequest接口等一系列接口

構造方法

方法名稱

描述

public HttpPost ()

無參數構造方法用以實例化對象

public HttpPost (URI uri)

通過URI對象構造HttpPost對象

public HttpPost (String uri)

通過指定的uri字符串地址構造實例化HttpPost對象

 

 

清楚了上面的所有常用API后,下面我們能過Apache HTTP來訪問HTTP資源

三步曲:

1.  創建HttpGet或者HttpPost對象,將要請求的URL對象構造方法傳入HttpGet、HttpPost對象

2.  通過HttpClent接口的實現類DefaultClent.的excute(HttpUriRequest request)而我們已經知道HttpGet和HttpPost類都實現了HttpUriRequest接口,所以這里面,我們可以將第1步創建好的 HttpGet或者HttpPost對象傳入進來。來得到HttpResponse對象

3.  通過HttpResponse取到返回的一些信息,再做提取

 

實例圖片:

 

帖上一部分源代碼:

布局文件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:orientation="vertical" android:layout_width="fill_parent"

   android:layout_height="fill_parent">

   <LinearLayout android:orientation="horizontal"

      android:layout_width="fill_parent" android:layout_height="wrap_content">

      <TextView android:layout_width="wrap_content"

        android:layout_height="wrap_content" android:text="url:" />

      <EditText android:id="@+id/urlText" android:layout_width="fill_parent"

        android:layout_height="wrap_content"

         android:text="http://10.0.2.2:8080/NetServer/queryServlet?bookId=2" />

   </LinearLayout>

   <LinearLayout android:orientation="horizontal"

      android:layout_width="fill_parent" android:layout_height="wrap_content"

      android:gravity="right">

      <Button android:id="@+id/getBtn" android:text="GET請求"

        android:layout_width="wrap_content" android:layout_height="wrap_content" />

      <Button android:id="@+id/postBtn" android:text="POST請求"

        android:layout_width="wrap_content" android:layout_height="wrap_content" />

   </LinearLayout>

   <TextView android:id="@+id/resultView" android:layout_width="fill_parent"

      android:layout_height="wrap_content" />

   <LinearLayout android:orientation="horizontal"

      android:layout_width="fill_parent" android:layout_height="wrap_content">

      <TextView android:layout_width="wrap_content"

        android:layout_height="wrap_content" android:text="圖片url:" />



      <EditText android:id="@+id/imageurlText" android:layout_width="fill_parent"

        android:layout_height="wrap_content" android:text="http://hiphotos.baidu.com/censhenlu/pic/item/3982b502915ddf9c7a8947c3.jpg" />

   </LinearLayout>

   <Button android:id="@+id/imgBtn" android:text="獲取圖片"

      android:layout_width="wrap_content" android:layout_height="wrap_content"

      android:layout_gravity="right" />

   <ImageView android:id="@+id/imgeView01" 

      android:layout_height="wrap_content" android:layout_width="fill_parent" />

</LinearLayout>
Java代碼:
package com.jiahui.net;



import java.io.InputStream;



import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.HttpClient;

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.util.EntityUtils;



import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;



public class HTTPDemoActivity extends Activity {



       private Button getBtn, postBtn, imageBtn;

       private EditText urlText, imageUrlText;

       private TextView resutlView;

       private ImageView imageView;



       public void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.main);



              urlText = (EditText) findViewById(R.id.urlText);

              imageUrlText = (EditText) findViewById(R.id.imageurlText);



              resutlView = (TextView) findViewById(R.id.resultView);

              getBtn = (Button) findViewById(R.id.getBtn);

              postBtn = (Button) findViewById(R.id.postBtn);

              imageBtn = (Button) findViewById(R.id.imgBtn);

              imageView = (ImageView) findViewById(R.id.imgeView01);



              getBtn.setOnClickListener(new OnClickListener() {

                     @Override

                     public void onClick(View v) {

                            System.out.println(urlText.getText().toString());

                            resutlView

                                          .setText(request("GET", urlText.getText().toString()));

                     }

              });



              postBtn.setOnClickListener(new OnClickListener() {

                     public void onClick(View v) {

                            System.out.println(urlText.getText().toString());

                            resutlView

                                          .setText(request("POST", urlText.getText().toString()));

                     }

              });

              imageBtn.setOnClickListener(new OnClickListener() {



                     public void onClick(View v) {



                            getImage(imageUrlText.getText().toString());

                     }

              });

       }

       private String request(String method, String url) {

              HttpResponse httpResponse = null;

              StringBuffer result = new StringBuffer();

              try {

                     if (method.equals("GET")) {

                            // 1.通過url創建HttpGet對象

                            HttpGet httpGet = new HttpGet(url);

                            // 2.通過DefaultClient的excute方法執行返回一個HttpResponse對象

                            HttpClient httpClient = new DefaultHttpClient();

                            httpResponse = httpClient.execute(httpGet);

                            // 3.取得相關信息

                            // 取得HttpEntiy

                            HttpEntity httpEntity = httpResponse.getEntity();

                            // 得到一些數據

                            // 通過EntityUtils并指定編碼方式取到返回的數據

                            result.append(EntityUtils.toString(httpEntity, "utf-8"));

                            //得到StatusLine接口對象

                            StatusLine statusLine = httpResponse.getStatusLine();



                            //得到協議

                            ;

                            result.append("協議:" + statusLine.getProtocolVersion() + "\r\n");

                            int statusCode = statusLine.getStatusCode();



                            result.append("狀態碼:" + statusCode + "\r\n");



                     } else if (method.equals("POST")) {



                            // 1.通過url創建HttpGet對象

                            HttpPost httpPost = new HttpPost(url);

                            // 2.通過DefaultClient的excute方法執行返回一個HttpResponse對象

                            HttpClient httpClient = new DefaultHttpClient();

                            httpResponse = httpClient.execute(httpPost);

                            // 3.取得相關信息

                            // 取得HttpEntiy

                            HttpEntity httpEntity = httpResponse.getEntity();

                            // 得到一些數據

                            // 通過EntityUtils并指定編碼方式取到返回的數據

                            result.append(EntityUtils.toString(httpEntity, "utf-8"));

                            StatusLine statusLine = httpResponse.getStatusLine();

                            statusLine.getProtocolVersion();

                            int statusCode = statusLine.getStatusCode();



                            result.append("狀態碼:" + statusCode + "\r\n");



                     }

              } catch (Exception e) {

                     Toast.makeText(HTTPDemoActivity.this, "網絡連接異常", Toast.LENGTH_LONG)

                                   .show();

              }

              return result.toString();

       }



       public void getImage(String url) {

              try {

                     // 1.通過url創建HttpGet對象

                     HttpGet httpGet = new HttpGet(url);

                     // 2.通過DefaultClient的excute方法執行返回一個HttpResponse對象

                     HttpClient httpClient = new DefaultHttpClient();

                     HttpResponse httpResponse = httpClient.execute(httpGet);

                     // 3.取得相關信息

                     // 取得HttpEntiy

                     HttpEntity httpEntity = httpResponse.getEntity();

                     // 4.通過HttpEntiy.getContent得到一個輸入流

                     InputStream inputStream = httpEntity.getContent();

                     System.out.println(inputStream.available());



                     //通過傳入的流再通過Bitmap工廠創建一個Bitmap

                     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                     //設置imageView          

                     imageView.setImageBitmap(bitmap);

              } catch (Exception e) {

                     Toast.makeText(HTTPDemoActivity.this, "網絡連接異常", Toast.LENGTH_LONG)

                     .show();

              }

       }



}

開發注意事項:

1.要想訪問本地機器不能寫成localhost或者127.0.0.1要寫成10.0.2.2。這是因為Android模擬器 (simulator)把它自己作為了localhost,也就是說,代碼中使用localhost或者127.0.0.1來訪問,都是訪問模擬器自己!若你想在模擬器simulator上面訪問你的電腦,那么就使用android內置的IP: 10.0.2.2,10.0.2.2是模擬器設定的特定ip,是你電腦的別名,在模擬器上用10.0.2.2就能成功訪問你的電腦本機。

2.記得加上網絡訪問權限

<uses-permission android:name="android.permission.INTERNET"/>

 

源代碼下載:http://download.csdn.net/detail/jiahui524/3690598
轉自:http://blog.csdn.net/jiahui524/article/details/6881006

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!