HttpURLConnection与HttpClient 区别及联系

  • ponseMessage():获取服务器的响应消息。
  • String getResponseMethod():获取发送请求的方法。
  • void setRequestMethod(String method):设置发送请求的方法。

       在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。

       为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的JavaScript代码;也不会对页面内容进行任何解析、处理。

       简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收
响应,以及管理HTTP连接。
       使用HttpClient发送请求、接收响应很简单,只要如下几步即可。

  1. 创建HttpClient对象。
  2. 如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
       另外, Android已经成功地集成了HttpClient,这意味着开发人员可以直接在Android应用中使用Httpclient来访问提交请求、接收响应。
       比如一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。
       其实访问Web应用中被保护的页面,使用浏览器则十分简单,用户通过系统提供的登录页面登录系统,浏览器会负责维护与服务器之间的Sesion,如果用户登录的用户名、密码符合要求,就可以访问被保护资源了。
       在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。

HttpURLConnection与 HttpClient 区别/性能测试对比


HttpClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等, 

HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便

HttpClient实际上是对Java提供方法的一些封装,

在HttpURLConnection中的输入输出流操作,

在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,

这样,就减少了操作的繁琐性。

性能方面这里做一个测试:

HttpURLConnection VS HttpClient性能测试  

版本: HttpURLConnection  jdk1.6;HttpClient 3.0.1

在项目中有一个特别小的相关应用,在选择时做了一下测试,之前先对两个类进行下说明:

HttpURLConnection  java的标准类(java.net)

HttpClient Jakarta Commons HttpClient,提供对HTTP协议访问的封装,包括http的请求头,参数,内容体,响应等及多线程的应用。

 

测试代码:

 

复制代码
    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  
    import java.net.HttpURLConnection;  
    import java.net.MalformedURLException;  
    import java.net.URL;  
      
    import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;  
    import org.apache.commons.httpclient.HttpClient;  
    import org.apache.commons.httpclient.HttpException;  
    import org.apache.commons.httpclient.HttpStatus;  
    import org.apache.commons.httpclient.methods.GetMethod;  
    import org.apache.commons.httpclient.params.HttpMethodParams;  
      
    public class HttpClientTest {  
      
        private static String link = "http://www.baidu.com";  
      
        public static void main(String[] args) {  
            long a = System.currentTimeMillis();  
            useHttpURlConnection();  
            long b = System.currentTimeMillis();  
            System.out.println("use httpurlconnection: "+(b-a));  
            long c = System.currentTimeMillis();  
            useHttpClient();  
            long d = System.currentTimeMillis();  
            System.out.println("use httpclient: "+(d-c));  
        }  
          
        public static void useHttpURlConnection(){  
            HttpURLConnection conn = null;  
            URL url = null;  
            String result = "";  
            try {  
                url = new java.net.URL(link);  
                conn = (HttpURLConnection) url.openConnection();  
                conn.setConnectTimeout(10000);  
                conn.connect();  
      
                InputStream urlStream = conn.getInputStream();  
                BufferedReader reader = new BufferedReader(new InputStreamReader(urlStream));  
                String s = "";  
                while ((s = reader.readLine()) != null) {  
                    result += s;  
                }  
                System.out.println(result);  
                reader.close();  
                urlStream.close();  
                conn.disconnect();  
            } catch (MalformedURLException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
      
        public static void useHttpClient(){  
            HttpClient client = new HttpClient();  
            GetMethod method = new GetMethod(link);  
            method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,  
                    new DefaultHttpMethodRetryHandler(3, false));  
            try {  
                int statusCode = client.executeMethod(method);  
      
                if (statusCode != HttpStatus.SC_OK) {  
                    System.err.println("Method failed: " + method.getStatusLine());  
                }  
                byte[] responseBody = method.getResponseBody();  
                System.out.println(new String(responseBody));  
            } catch (HttpException e) {  
                System.err.println("Fatal protocol violation: " + e.getMessage());  
                e.printStackTrace();  
            } catch (IOException e) {  
                System.err.println("Fatal transport error: " + e.getMessage());  
                e.printStackTrace();  
            } finally {  
                method.releaseConnection();  
            }  
        }  
    }  
复制代码

 

测试结果:

use httpurlconnection: 47

use httpclient: 641

 

结果很明显示,但是在实际应用中,还是应该根据实际的需求进行取舍。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值