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

相关文章
相关标签/搜索