Android開發進階(四)--深刻Android經過Apache HTTP訪問HTTP資源


深刻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取到返回的一些信息,再作提取

 

實例圖片:

 

帖上一部分源代碼:

佈局文件:

[html]   view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   
  5.    android:orientation="vertical" android:layout_width="fill_parent"  
  6.   
  7.    android:layout_height="fill_parent">  
  8.   
  9.    <LinearLayout android:orientation="horizontal"  
  10.   
  11.       android:layout_width="fill_parent" android:layout_height="wrap_content">  
  12.   
  13.       <TextView android:layout_width="wrap_content"  
  14.   
  15.         android:layout_height="wrap_content" android:text="url:" />  
  16.   
  17.       <EditText android:id="@+id/urlText" android:layout_width="fill_parent"  
  18.   
  19.         android:layout_height="wrap_content"  
  20.   
  21.          android:text="http://10.0.2.2:8080/NetServer/queryServlet?bookId=2" />  
  22.   
  23.    </LinearLayout>  
  24.   
  25.    <LinearLayout android:orientation="horizontal"  
  26.   
  27.       android:layout_width="fill_parent" android:layout_height="wrap_content"  
  28.   
  29.       android:gravity="right">  
  30.   
  31.       <Button android:id="@+id/getBtn" android:text="GET請求"  
  32.   
  33.         android:layout_width="wrap_content" android:layout_height="wrap_content" />  
  34.   
  35.       <Button android:id="@+id/postBtn" android:text="POST請求"  
  36.   
  37.         android:layout_width="wrap_content" android:layout_height="wrap_content" />  
  38.   
  39.    </LinearLayout>  
  40.   
  41.    <TextView android:id="@+id/resultView" android:layout_width="fill_parent"  
  42.   
  43.       android:layout_height="wrap_content" />  
  44.   
  45.    <LinearLayout android:orientation="horizontal"  
  46.   
  47.       android:layout_width="fill_parent" android:layout_height="wrap_content">  
  48.   
  49.       <TextView android:layout_width="wrap_content"  
  50.   
  51.         android:layout_height="wrap_content" android:text="圖片url:" />  
  52.   
  53.    
  54.   
  55.       <EditText android:id="@+id/imageurlText" android:layout_width="fill_parent"  
  56.   
  57.         android:layout_height="wrap_content" android:text="http://hiphotos.baidu.com/censhenlu/pic/item/3982b502915ddf9c7a8947c3.jpg" />  
  58.   
  59.    </LinearLayout>  
  60.   
  61.    <Button android:id="@+id/imgBtn" android:text="獲取圖片"  
  62.   
  63.       android:layout_width="wrap_content" android:layout_height="wrap_content"  
  64.   
  65.       android:layout_gravity="right" />  
  66.   
  67.    <ImageView android:id="@+id/imgeView01"   
  68.   
  69.       android:layout_height="wrap_content" android:layout_width="fill_parent" />  
  70.   
  71. </LinearLayout>  


 

Java代碼:

[java]   view plain copy print ?
  1. package com.jiahui.net;  
  2.   
  3.    
  4.   
  5. import java.io.InputStream;  
  6.   
  7.    
  8.   
  9. import org.apache.http.HttpEntity;  
  10.   
  11. import org.apache.http.HttpResponse;  
  12.   
  13. import org.apache.http.StatusLine;  
  14.   
  15. import org.apache.http.client.HttpClient;  
  16.   
  17. import org.apache.http.client.methods.HttpGet;  
  18.   
  19. import org.apache.http.client.methods.HttpPost;  
  20.   
  21. import org.apache.http.impl.client.DefaultHttpClient;  
  22.   
  23. import org.apache.http.util.EntityUtils;  
  24.   
  25.    
  26.   
  27. import android.app.Activity;  
  28.   
  29. import android.graphics.Bitmap;  
  30.   
  31. import android.graphics.BitmapFactory;  
  32.   
  33. import android.os.Bundle;  
  34.   
  35. import android.view.View;  
  36.   
  37. import android.view.View.OnClickListener;  
  38.   
  39. import android.widget.Button;  
  40.   
  41. import android.widget.EditText;  
  42.   
  43. import android.widget.ImageButton;  
  44.   
  45. import android.widget.ImageView;  
  46.   
  47. import android.widget.TextView;  
  48.   
  49. import android.widget.Toast;  
  50.   
  51.    
  52.   
  53. public class HTTPDemoActivity extends Activity {  
  54.   
  55.    
  56.   
  57.        private Button getBtn, postBtn, imageBtn;  
  58.   
  59.        private EditText urlText, imageUrlText;  
  60.   
  61.        private TextView resutlView;  
  62.   
  63.        private ImageView imageView;  
  64.   
  65.    
  66.   
  67.        public void onCreate(Bundle savedInstanceState) {  
  68.   
  69.               super.onCreate(savedInstanceState);  
  70.   
  71.               setContentView(R.layout.main);  
  72.   
  73.    
  74.   
  75.               urlText = (EditText) findViewById(R.id.urlText);  
  76.   
  77.               imageUrlText = (EditText) findViewById(R.id.imageurlText);  
  78.   
  79.    
  80.   
  81.               resutlView = (TextView) findViewById(R.id.resultView);  
  82.   
  83.               getBtn = (Button) findViewById(R.id.getBtn);  
  84.   
  85.               postBtn = (Button) findViewById(R.id.postBtn);  
  86.   
  87.               imageBtn = (Button) findViewById(R.id.imgBtn);  
  88.   
  89.               imageView = (ImageView) findViewById(R.id.imgeView01);  
  90.   
  91.    
  92.   
  93.               getBtn.setOnClickListener(new OnClickListener() {  
  94.   
  95.                      @Override  
  96.   
  97.                      public void onClick(View v) {  
  98.   
  99.                             System.out.println(urlText.getText().toString());  
  100.   
  101.                             resutlView  
  102.   
  103.                                           .setText(request("GET", urlText.getText().toString()));  
  104.   
  105.                      }  
  106.   
  107.               });  
  108.   
  109.                 
  110.   
  111.               postBtn.setOnClickListener(new OnClickListener() {  
  112.   
  113.                      public void onClick(View v) {  
  114.   
  115.                             System.out.println(urlText.getText().toString());  
  116.   
  117.                             resutlView  
  118.   
  119.                                           .setText(request("POST", urlText.getText().toString()));  
  120.   
  121.                      }  
  122.   
  123.               });  
  124.   
  125.               imageBtn.setOnClickListener(new OnClickListener() {  
  126.   
  127.    
  128.   
  129.                      public void onClick(View v) {  
  130.   
  131.    
  132.   
  133.                             getImage(imageUrlText.getText().toString());  
  134.   
  135.                      }  
  136.   
  137.               });  
  138.   
  139.        }  
  140.   
  141.        private String request(String method, String url) {  
  142.   
  143.               HttpResponse httpResponse = null;  
  144.   
  145.               StringBuffer result = new StringBuffer();  
  146.   
  147.               try {  
  148.   
  149.                      if (method.equals("GET")) {  
  150.   
  151.                             // 1.經過url建立HttpGet對象  
  152.   
  153.                             HttpGet httpGet = new HttpGet(url);  
  154.   
  155.                             // 2.經過DefaultClient的excute方法執行返回一個HttpResponse對象  
  156.   
  157.                             HttpClient httpClient = new DefaultHttpClient();  
  158.   
  159.                             httpResponse = httpClient.execute(httpGet);  
  160.   
  161.                             // 3.取得相關信息  
  162.   
  163.                             // 取得HttpEntiy  
  164.   
  165.                             HttpEntity httpEntity = httpResponse.getEntity();  
  166.   
  167.                             // 獲得一些數據  
  168.   
  169.                             // 經過EntityUtils並指定編碼方式取到返回的數據  
  170.   
  171.                             result.append(EntityUtils.toString(httpEntity, "utf-8"));  
  172.   
  173.                             //獲得StatusLine接口對象  
  174.   
  175.                             StatusLine statusLine = httpResponse.getStatusLine();  
  176.   
  177.    
  178.   
  179.                             //獲得協議  
  180.   
  181.                             ;  
  182.   
  183.                             result.append("協議:" + statusLine.getProtocolVersion() + "\r\n");  
  184.   
  185.                             int statusCode = statusLine.getStatusCode();  
  186.   
  187.    
  188.   
  189.                             result.append("狀態碼:" + statusCode + "\r\n");  
  190.   
  191.    
  192.   
  193.                      } else if (method.equals("POST")) {  
  194.   
  195.    
  196.   
  197.                             // 1.經過url建立HttpGet對象  
  198.   
  199.                             HttpPost httpPost = new HttpPost(url);  
  200.   
  201.                             // 2.經過DefaultClient的excute方法執行返回一個HttpResponse對象  
  202.   
  203.                             HttpClient httpClient = new DefaultHttpClient();  
  204.   
  205.                             httpResponse = httpClient.execute(httpPost);  
  206.   
  207.                             // 3.取得相關信息  
  208.   
  209.                             // 取得HttpEntiy  
  210.   
  211.                             HttpEntity httpEntity = httpResponse.getEntity();  
  212.   
  213.                             // 獲得一些數據  
  214.   
  215.                             // 經過EntityUtils並指定編碼方式取到返回的數據  
  216.   
  217.                             result.append(EntityUtils.toString(httpEntity, "utf-8"));  
  218.   
  219.                             StatusLine statusLine = httpResponse.getStatusLine();  
  220.   
  221.                             statusLine.getProtocolVersion();  
  222.   
  223.                             int statusCode = statusLine.getStatusCode();  
  224.   
  225.    
  226.   
  227.                             result.append("狀態碼:" + statusCode + "\r\n");  
  228.   
  229.    
  230.   
  231.                      }  
  232.   
  233.               } catch (Exception e) {  
  234.   
  235.                      Toast.makeText(HTTPDemoActivity.this"網絡鏈接異常", Toast.LENGTH_LONG)  
  236.   
  237.                                    .show();  
  238.   
  239.               }  
  240.   
  241.               return result.toString();  
  242.   
  243.        }  
  244.   
  245.    
  246.   
  247.        public void getImage(String url) {  
  248.   
  249.               try {  
  250.   
  251.                      // 1.經過url建立HttpGet對象  
  252.   
  253.                      HttpGet httpGet = new HttpGet(url);  
  254.   
  255.                      // 2.經過DefaultClient的excute方法執行返回一個HttpResponse對象  
  256.   
  257.                      HttpClient httpClient = new DefaultHttpClient();  
  258.   
  259.                      HttpResponse httpResponse = httpClient.execute(httpGet);  
  260.   
  261.                      // 3.取得相關信息  
  262.   
  263.                      // 取得HttpEntiy  
  264.   
  265.                      HttpEntity httpEntity = httpResponse.getEntity();  
  266.   
  267.                      // 4.經過HttpEntiy.getContent獲得一個輸入流  
  268.   
  269.                      InputStream inputStream = httpEntity.getContent();  
  270.   
  271.                      System.out.println(inputStream.available());  
  272.   
  273.                        
  274.   
  275.                      //經過傳入的流再經過Bitmap工廠建立一個Bitmap  
  276.   
  277.                      Bitmap bitmap = BitmapFactory.decodeStream(inputStream);  
  278.   
  279.                      //設置imageView            
  280.   
  281.                      imageView.setImageBitmap(bitmap);  
  282.   
  283.               } catch (Exception e) {  
  284.   
  285.                      Toast.makeText(HTTPDemoActivity.this"網絡鏈接異常", Toast.LENGTH_LONG)  
  286.   
  287.                      .show();  
  288.   
  289.               }  
  290.   
  291.        }  
  292.   
  293.    
  294.   
  295. }  


 

開發注意事項:

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

相關文章
相關標籤/搜索