`
mingren135
  • 浏览: 72447 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HttpClient4使用

 
阅读更多

 

一、构造HttpClient对象

static {  

httpParams = new BasicHttpParams();  

// 设置连接超时时间  
HttpConnectionParams.setConnectionTimeout(httpParams, 500);
// 设置读取超时时间  
HttpConnectionParams.setSoTimeout(httpParams, 2000); 
  
SchemeRegistry registry = new SchemeRegistry();  
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
  
connectionManager = new ThreadSafeClientConnManager(httpParams, registry);

//设置最大连接数 
connectionManager.setMaxTotal(800);
//设置每个路由最大连接数
connectionManager.setDefaultMaxPerRoute(100);
//指定host的最大连接数
connectionManager.setMaxForRoute(new HttpRoute(new HttpHost("localhost",5);

}  
  
public static HttpClient getHttpClient() {  
    return new DefaultHttpClient(connectionManager, httpParams);  
}  

 

什么是route:可以理解为运行环境机器到目标机器的一条线路。举例来说,我们使用HttpClient的实现来分别请求 www.baidu.com 的资源和 www.bing.com 的资源那么他就会产生两个route。

这里为什么要特别提到route最大连接数这个参数呢,因为这个参数的默认值为2,如果不设置这个参数值默认情况下对于同一个目标机器的最大并发连接只有2个!这意味着如果你正在执行一个针对某一台目标机器的抓取任务的时候,哪怕你设置连接池的最大连接数为200,但是实际上还是只有2个连接在工作,其他剩余的198个连接都在等待,都是为别的目标机器服务的。 

 

@ThreadSafe
public final class ConnPerRouteBean implements ConnPerRoute {

    /** The default maximum number of connections allowed per host */
    public static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2;   // Per RFC 2616 sec 8.1.4

    private final ConcurrentHashMap<HttpRoute, Integer> maxPerHostMap;

    private volatile int defaultMax;

    public ConnPerRouteBean(int defaultMax) {
        super();
        this.maxPerHostMap = new ConcurrentHashMap<HttpRoute, Integer>();
        setDefaultMaxPerRoute(defaultMax);
    }

    public ConnPerRouteBean() {
        this(DEFAULT_MAX_CONNECTIONS_PER_ROUTE);
    }

 

二、GET请求

1、准备参数及Encode

List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>(); 
data.add(new BasicNameValuePair("name","jack"));
data.add(new BasicNameValuePair("age","14"));
data.add(new BasicNameValuePair("country","中国"));
//使用UTF8避免中文乱码
String dataStr = URLEncodedUtils.format(data, "UTF-8");

 

 2、构造GET请求

URI uri = URIUtils.createURI("http", "www.taobao.com", -1, "/", dataStr, null);
HttpUriRequest request = new HttpGet(uri);

 

3、发起GET请求

HttpResponse response = getHttpClient().execute(request);

 

 4、处理请求结果

HttpEntity entity = response.getEntity();
//获取字符串,指定UTF8避免乱码
String content = EntityUtils.toString(entity, "UTF-8");

 

 5、关闭数据流

EntityUtils.consume(entity);
------
public static void consume(final HttpEntity entity) throws IOException {
        if (entity == null) {
            return;
        }
        if (entity.isStreaming()) {
            InputStream instream = entity.getContent();
            if (instream != null) {
                instream.close();
            }
        }
    }

 

 

 三、POST请求

1、准备参数及Encode

List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>(); 
data.add(new BasicNameValuePair("name","jack"));
data.add(new BasicNameValuePair("age","14"));
data.add(new BasicNameValuePair("country","中国"));
HttpEntity entity = new UrlEncodedFormEntity(data, "UTF-8");

 

2、构造POST请求 

HttpPost httpPost = new HttpPost("http://www.taobao.com");
httpPost.setEntity(entity);

 

3、发起POST请求:同GET

4、处理请求结果:同GET

5、关闭数据流:同GET

 

四、Header设置

HttpGet get = new HttpGet(url);  
get.addHeader(HttpHeaders.ACCEPT, "text/html");  
get.addHeader(HttpHeaders.ACCEPT_CHARSET, "utf-8");  
get.addHeader(HttpHeaders.ACCEPT_ENCODING, "gzip");  
get.addHeader(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN");  
get.addHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Linux x86_64)");

 

HttpHeaders常量枚举

/**
 * Constants enumerating the HTTP headers. All headers defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and RFC2518
 * (WebDAV) are listed.
 *
 * @since 4.1
 */
public final class HttpHeaders {

    private HttpHeaders() {
    }

    /** RFC 2616 (HTTP/1.1) Section 14.1 */
    public static final String ACCEPT = "Accept";
......
 

 使用gzip访问,可以压缩服务端返回的数据,节省宽带占用,集群也会因此而提高响应速度

 

DefaultHttpClient httpclient = new DefaultHttpClient();  
  
       httpclient.addRequestInterceptor(new HttpRequestInterceptor() {  
            
           public void process(  
                   final HttpRequest request,   
                   final HttpContext context) throws HttpException, IOException {  
               if (!request.containsHeader("Accept-Encoding")) {  
                   request.addHeader("Accept-Encoding", "gzip");  
               }  
           }  
  
       });  
         
       httpclient.addResponseInterceptor(new HttpResponseInterceptor() {  
            
           public void process(  
                   final HttpResponse response,   
                   final HttpContext context) throws HttpException, IOException {  
               HttpEntity entity = response.getEntity();  
               Header ceheader = entity.getContentEncoding();  
               if (ceheader != null) {  
                   HeaderElement[] codecs = ceheader.getElements();  
                   for (int i = 0; i < codecs.length; i++) {  
                       if (codecs[i].getName().equalsIgnoreCase("gzip")) {  
                           response.setEntity(  
                                   new GzipDecompressingEntity(response.getEntity()));   
                           return;  
                       }  
                   }  
               }  
           }  
             
       });  
         
       HttpGet httpget = new HttpGet("http://www.apache.org/");   
         
       // Execute HTTP request  
       System.out.println("executing request " + httpget.getURI());  
       HttpResponse response = httpclient.execute(httpget);  
  
       System.out.println("----------------------------------------");  
       System.out.println(response.getStatusLine());  
       System.out.println(response.getLastHeader("Content-Encoding"));  
       System.out.println(response.getLastHeader("Content-Length"));  
       System.out.println("----------------------------------------");  
  
       HttpEntity entity = response.getEntity();  
         
       if (entity != null) {  
           String content = EntityUtils.toString(entity);  
           System.out.println(content);  
           System.out.println("----------------------------------------");  
           System.out.println("Uncompressed size: "+content.length());  
       }  
 

五、Cookie设置

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    android httpclient4

    ### Android HttpClient4 使用详解 #### 一、概述 在Android应用开发中,网络通信是非常重要的一个环节。HttpClient作为Apache组织下的一个开源项目,为开发者提供了简单而强大的HTTP客户端功能。HttpClient 4.x...

    httpclient4中文教程.doc

    本教程将介绍HttpClient的基本概念和使用方法。 首先,HttpClient的核心功能是执行HTTP请求。通过创建HttpClient实例和指定的HTTP方法对象(如HttpGet、HttpPost等),可以向目标服务器发起请求并获取响应。以下是...

    HttpClient 3.x to HttpComponents HttpClient 4.x

    例如,在HttpClient 3.x中,代码可能会使用`***mons.httpclient.HttpClient`类和`***mons.httpclient.methods.GetMethod`等,而在4.x版本中,这些都被新的API所替代。程序员需要熟悉`org.apache....

    httpclient4.5发送https请求(验证证书)

    不会的可以在评论区留言哈,这是我自己做项目用到的。所以绝对可用!同时共享出来给到大家

    httpclient4中文API和使用

    首先,`httpclient4中文API.pdf`是HttpClient 4.5的中文版API文档,是学习和使用HttpClient的重要参考资料。这个文档通常会包含HttpClient的类结构、接口、方法等详细信息,以及如何使用这些API来构建HTTP请求的示例...

    httpClient4jar包

    在描述中提到的“httpclient4”,指的是HttpClient 4.x系列,这是一个稳定且广泛使用的版本。 在HttpClient 4.4.1.jar中,包含了HttpClient的主要功能实现,如HTTP方法(GET, POST等)、连接管理、重定向处理、身份...

    httpClient4 最新帮助文档

    - HttpClient 4支持异步操作,使用`HttpAsyncClient`,可以实现非阻塞的请求/响应处理。 - 异步请求的回调可以通过`Future&lt;HttpResponse&gt;`和` HttpContext`来处理。 6. **重试策略和异常处理**: - 可以配置重试...

    httpclient4

    在本文中,我们将深入探讨HttpClient 4的关键特性、使用方法以及常见应用场景。 1. **基本概念** - **HttpClient**:HttpClient 是一个实现了HTTP协议的客户端编程工具包,支持HTTP/1.0和HTTP/1.1协议,同时具备...

    HttpClient 4 - 文件上传

    HttpClient 4 版本引入了许多改进,使得文件上传变得更加简单和高效。在这个主题中,我们将深入探讨HttpClient 4如何实现文件上传,以及相关的核心概念和技术。 首先,我们需要了解HttpClient 4的基本用法。...

    httpclient 4.X版本下载有的带源码包

    2013-11-21 15:31 292,890 httpclient-4.0.2.jar 2017-12-20 12:08 351,132 httpclient-4.1.1.jar 2012-08-03 01:45 451,595 httpclient-4.1.2-sources.jar 2012-08-03 01:44 352,254 httpclient-4.1.2.jar 2012-08-...

    HttpClient 4文件上传

    本文档将详细介绍如何使用HttpClient 4.x版本实现文件上传功能。 #### 二、核心类与接口介绍 1. **HttpClient**: - `HttpClient`是Apache HttpClient提供的核心接口,用于执行HTTP请求并获取响应。 - 在本例中...

    HttpClient4模拟登录回贴

    这篇博客通过实例展示了如何使用HttpClient4模拟登录并进行回贴操作,这对于理解HttpClient4的使用方法及其在网络编程中的应用非常有帮助。如果想要深入学习,可以参考官方文档和相关教程,以更好地掌握HttpClient4...

    httpclient简单使用

    本教程将基于标题"HTTPClient简单使用"和提供的文件`HttpService`、`HttpClient`来阐述HTTPClient的基本使用方法。 1. **HTTPClient简介** HTTPClient是Apache的 HttpClient库,它为Java开发者提供了全面的HTTP...

    commons-httpclient,java中使用httpclient中使用的扩展工具

    同时,注意HttpClient库已经不再更新,对于新的Java项目,推荐使用现代化的HTTP客户端库,如Apache HttpClient的后继者Apache HTTP Components HttpClient 4.x系列,或者使用Java标准库的`java.net.http.HttpClient`...

    httpclient4源码

    《深入剖析HTTPClient4源码》 HTTPClient4是Apache软件基金会开发的一个强大的HTTP客户端库,广泛应用于Java编程中,提供了高效、灵活且可扩展的HTTP通信能力。它支持多种HTTP协议版本,包括HTTP/1.1和部分HTTP/2...

    Commons HTTPClient4&#46;X组件应用示例

    ### Commons HTTPClient4.X 组件应用详解 #### 一、引言 ...传统的做法是使用浏览器或者基于JDK提供的`java.net`...对于需要频繁与Web服务器进行交互的应用程序而言,使用HttpClient4组件将极大提高开发效率和应用质量。

    httpclient4 封装

    在这个“httpclient4 封装”中,我们将探讨HttpClient 4.2版本的使用,以及如何将它封装到自己的项目中。 HttpClient 4.2是Apache HttpClient系列的一个稳定版本,它支持HTTP/1.1和部分HTTP/2协议,提供了对HTTPS、...

    httpclient4之百度模拟登陆,回复与58同城自动登陆

    本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...

    使用HttpClient必须的jar包

    4. **连接管理**:HttpClient提供了`PoolingHttpClientConnectionManager`,用于管理HTTP连接池,可以有效地复用连接,提高性能并减少网络资源消耗。 5. **Cookie管理**:HttpClient支持`CookieSpecs`和`...

Global site tag (gtag.js) - Google Analytics