Android Http编程之HttpClient

来源:互联网 发布:淘宝分销怎么同步库存 编辑:程序博客网 时间:2024/04/29 21:56

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://liangruijun.blog.51cto.com/3061169/803097

    在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。

HTTP工作原理:

1.客户端(一般是指浏览器,这里是指自己写的程序)与服务器建立连接

2.建立连接后,客户端向服务器发送请求

3.服务器接收到请求后,向客户端发送响应信息

4.客户端与服务器断开连接

HttpClient的一般使用步骤:

1.使用DefaultHttpClient类实例化HttpClient对象

2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

3.调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

4.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

最后记得要在AndroidManifest.xml文件添加网络权限

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

 下面是具体的例子:

1.使用HttpClient来执行GET调用

在LogCat窗口就能看到输出的信息

  1. package com.lingdududu.http;  
  2.  
  3. import java.io.InputStream;  
  4.  
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.HttpStatus;  
  7. import org.apache.http.client.HttpClient;  
  8. import org.apache.http.client.methods.HttpGet;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10.  
  11. import android.app.Activity;  
  12. import android.os.Bundle;  
  13. import android.util.Log;  
  14.  
  15. public class HttpGetActivity extends Activity {  
  16.     String uri = "http://developer.android.com/";  
  17.     final String TAG_STRING = "TAG";  
  18.     @Override 
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.           
  23.         try {  
  24.             //得到HttpClient对象  
  25.             HttpClient getClient = new DefaultHttpClient();  
  26.             //得到HttpGet对象  
  27.             HttpGet request = new HttpGet(uri);  
  28.             //客户端使用GET方式执行请教,获得服务器端的回应response  
  29.             HttpResponse response = getClient.execute(request);  
  30.             //判断请求是否成功    
  31.             if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
  32.                 Log.i(TAG_STRING, "请求服务器端成功");  
  33.                 //获得输入流  
  34.                 InputStream  inStrem = response.getEntity().getContent();  
  35.                 int result = inStrem.read();  
  36.                 while (result != -1){  
  37.                     System.out.print((char)result);  
  38.                     result = inStrem.read();  
  39.                 }  
  40.                 //关闭输入流  
  41.                 inStrem.close();      
  42.             }else {  
  43.                 Log.i(TAG_STRING, "请求服务器端失败");  
  44.             }             
  45.         } catch (Exception e) {  
  46.             // TODO Auto-generated catch block  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  

使用HTTP GET调用有一个缺点就是,请求的参数作为URL一部分来传递,以这种方式传递的时候,URL的长度应该在2048个字符之内。如果超出这个这范围,就要使用到HTTP POST调用。

2.使用HttpClient来执行POST调用

 使用POST调用进行参数传递时,需要使用NameValuePair来保存要传递的参数。NameValuePair封装了一个键/值组合。另外,还需要设置所使用的字符集。

  1. package com.androidbook.services.httppost;  
  2.  
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.  
  9. import org.apache.http.HttpResponse;  
  10. import org.apache.http.NameValuePair;  
  11. import org.apache.http.client.HttpClient;  
  12. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  13. import org.apache.http.client.methods.HttpPost;  
  14. import org.apache.http.impl.client.DefaultHttpClient;  
  15. import org.apache.http.message.BasicNameValuePair;  
  16.  
  17. import android.app.Activity;  
  18. import android.os.Bundle;  
  19.  
  20. public class HttpPostActivity extends Activity {  
  21.     String uri = "http://developer.android.com/";  
  22.     @Override 
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.  
  27.         BufferedReader in = null;  
  28.         try {  
  29.             HttpClient client = new DefaultHttpClient();  
  30.             HttpPost request = new HttpPost("http://code.google.com/android/");  
  31.             //使用NameValuePair来保存要传递的Post参数  
  32.             List<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
  33.             //添加要传递的参数    
  34.             postParameters.add(new BasicNameValuePair("id""12345"));  
  35.             postParameters.add(new BasicNameValuePair("username""dave"));  
  36.             //实例化UrlEncodedFormEntity对象  
  37.             UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(  
  38.                     postParameters);
  39. /*
  40. 可以用UrlEncodedFormEntity的第二个参数指定编码类型HTTP.UTF_8
  41.    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity( postParameters,HTTP.UTF_8);
  42. */
  43.             //使用HttpPost对象来设置UrlEncodedFormEntity的Entity  
  44.             request.setEntity(formEntity);  
  45.             HttpResponse response = client.execute(request);  
  46. if(response.getStatusLine().getStatusCode()==200) {
    /*
String msg=EntityUtils.toString(response.getEntity());
//String msg=EntityUtils.toString(response.getEntity(),"utf-8");
return msg;
或者
Byte[] data =EntityUtils.toByteArray(response.getEntity());
Byte[] data =EntityUtils.toByteArray(response.getEntity(),"utf-8");
return data;
*/
InputStream is =response.getEntity().getContent();
  1.             in = new BufferedReader(new InputStreamReader(is));  
  2.             StringBuffer string = new StringBuffer("");  
  3.             String lineStr = "";  
  4.             while ((lineStr = in.readLine()) != null) {  
  5.                 string.append(lineStr + "\n");  
  6.             }  
  7.             in.close();  
  8.             String resultStr = string.toString();  
  9.             System.out.println(resultStr);  
  10.         } catch(Exception e) {  
  11.             // Do something about exceptions  
  12.         } finally {  
  13.             if (in != null) {  
  14.                 try {  
  15.                     in.close();  
  16.                 } catch (IOException e) {  
  17.                     e.printStackTrace();  
  18.                 }  
  19.             }  
  20. httpClient.getConnectionManager().shutdo
  21.         }  
  22.     }  

本文出自 “IT的点点滴滴” 博客,请务必保留此出处http://liangruijun.blog.51cto.com/3061169/803097


当然最好在连接之前设置下网络的具体参数

2.2. Apache接口 

  Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient(org.apache.commons.httpclient.*) 和 HttpComponents  (org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类:

使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:

·创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象

·设置连接参数

·执行 HTTP 操作

·处理服务器返回结果

import org.apache.http.HttpEntity;   

      import org.apache.http.HttpHost;   

      import org.apache.http.HttpResponse;   

      import org.apache.http.auth.AuthScope;   

      import org.apache.http.auth.UsernamePasswordCredentials;   

      import org.apache.http.client.methods.HttpGet;   

      import org.apache.http.conn.params.ConnRoutePNames;   

      import org.apache.http.params. HttpConnectionParams;   

      import org.apache.http.client.params. HttpClientParams;   

  try {   

         // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)   

          HttpParams params = new BasicHttpParams();   

            // 设置连接超时和 Socket 超时,以及 Socket 缓存大小   

          HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);   

          HttpConnectionParams.setSoTimeout(params, 20 * 1000);   

          HttpConnectionParams.setSocketBufferSize(params, 8192);   

            // 设置重定向,缺省为 true   

          HttpClientParams.setRedirecting(params, true); 

          // 设置 user agent   

          HttpProtocolParams.setUserAgent(params, userAgent);  

          // 创建一个 HttpClient 实例   

          // 注意 HttpClient httpClient = new HttpClient(); Commons HttpClient    

          // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient   

          HttpClient httpClient = new DefaultHttpClient(params);   

             // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向   

          HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   

  

          HttpResponse response = client.execute(httpGet);   

          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   

              // 错误处理,例如可以在该请求正常结束前将其中断   

              httpGet.abort();   

          }   

  

          // 读取更多信息   

          Header[] headers = response.getHeaders();   

          HttpEntity entity = response.getEntity();   

          Header header = response.getFirstHeader("Content-Type");   

      } catch (Exception ee) {   

          //   

      } finally {   

          // 释放连接   

          client.getConnectionManager().shutdown();    

      }  





  import org.apache.http.HttpEntity;

        import org.apache.http.HttpHost;

        import org.apache.http.HttpResponse;

        import org.apache.http.auth.AuthScope;

        import org.apache.http.auth.UsernamePasswordCredentials;

        import org.apache.http.client.methods.HttpGet;

        import org.apache.http.conn.params.ConnRoutePNames;

        import org.apache.http.params. HttpConnectionParams;

        import org.apache.http.client.params. HttpClientParams;

        try {

            // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)

            HttpParams params = new BasicHttpParams();

            // 设置连接超时和 Socket 超时,以及 Socket 缓存大小

            HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

            HttpConnectionParams.setSoTimeout(params, 20 * 1000);

            HttpConnectionParams.setSocketBufferSize(params, 8192);

            // 设置重定向,缺省为 true

            HttpClientParams.setRedirecting(params, true);

            // 设置 user agent

            HttpProtocolParams.setUserAgent(params, userAgent);

            // 创建一个 HttpClient 实例

            // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

            // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

            HttpClient httpClient = new DefaultHttpClient(params);

            // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

            HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

            HttpResponse response = client.execute(httpGet);

            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {HttpStatus.SC_OK是200

                // 错误处理,例如可以在该请求正常结束前将其中断

                httpGet.abort();

            }

 

            // 读取更多信息

            Header[] headers = response.getHeaders();

            HttpEntity entity = response.getEntity();

            Header header = response.getFirstHeader("Content-Type");

        } catch (Exception ee) {

            //

        } finally {

            // 释放连接

            client.getConnectionManager().shutdown();

        }

  以下例子以 HttpGet 方式通过代理访问 HTTPS 网站:

      try {   

           HttpClient httpClient = new HttpClient();   

           // 设置认证的数据   

           httpClient.getCredentialsProvider().setCredentials(   

                   new AuthScope("your_auth_host", 80, "your_realm"),      

                   new UsernamePasswordCredentials("username", "password"));   

           // 设置服务器地址,端口,访问协议   

           HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");   

  

           // 设置代理   

           HttpHost proxy = new HttpHost("192.168.1.1", 80);   

           httpClient.getParams().setParameter   

                (ConnRoutePNames.DEFAULT_PROXY, proxy);

           // 创建一个 HttpGet 实例   

           HttpGet httpGet = new HttpGet("/a/b/c");

           // 连接服务器并获取应答数据   

           HttpResponse response = httpClient.execute(targetHost, httpGet);  

           // 读取应答数据   

           int statusCode = response.getStatusLine().getStatusCode();   

           Header[] headers = response.getHeaders();   

           HttpEntity entity = response.getEntity();   

       } catch (Exception ee) {   

           //   

 


0 0