深入Android通過Apache HTTP訪問HTTP資源
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