深刻Android經過Apache HTTP訪問HTTP資源 html
HttpClient接口 java
實現類:DefaultHttpClient這也是經常使用的一個用於實現HttpClient接口的子類, android
HttpClietnt中定義的經常使用抽象方法 apache
方法名稱 數組 |
描述 服務器 |
public abstract HttpResponse execute (HttpUriRequest request) 網絡 |
經過HttpUriRequest對象執行返回一個HttpResponse對象 app |
public abstract HttpResponse execute (HttpUriRequest request, HttpContext context) ide |
經過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