httpclient使用介绍

2016-04-07 22:33:00
admin
原创 4113
摘要:httpclient使用介绍

一、httpclient使用介绍

1、官方文档:https://hc.apache.org/index.html

2、HttpClient.executeOpen(target,request,context),进行请求,然后返回响应;

3、HttpClient.execute(request,responseHandler),进行请求,然后处理响应;

4、executeOpen不关闭响应,execute关闭响应,必须在handler处理响应

5、保证连接能够复用,必须消费所有返回内容,以下方式二选一即可;

6、获取返回内容:EntityUtils.toString(entity, "UTF-8")

7、丢弃返回内容:EntityUtils.consume(entity)

8、ClassicRequestBuilder创建BasicClassicHttpRequest实例,不支持取消请求;

9、代码示例:HttpClientDemo.javaHttpClient5Demo.javahttpdemo.zip


请求关系:

1、BasicClassicHttpRequest implements ClassicHttpRequest

2、HttpUriRequestBase implements CancellableDependency

3、HttpUriRequestBase extends BasicClassicHttpRequest

4、HttpGet extends HttpUriRequestBase

5、HttpPost extends HttpUriRequestBase


创建请求:

1、ClassicHttpRequest request = ClassicRequestBuilder.get(url).build();

2、ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
3、params.add(new BasicNameValuePair("name", "value"));
4、UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
5、ClassicHttpRequest request = ClassicRequestBuilder.post(url).setEntity(entity).build();


executeOpen示例:

HttpHost target = new HttpHost("http", "211.149.156.144", 8080);
HttpGet request = new HttpGet("/springmvc/test_get.do");
ClassicHttpResponse response = httpclient.executeOpen(target, request, null);


取消请求示例:

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.schedule(request::cancel, 10, TimeUnit.SECONDS);


依赖配置:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.4.2</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
</dependency>


二、httpclient使用详解

1、Http1Config可以配置header最大数量和最大长度,默认没有限制;

2、HttpClient默认实现是InternalHttpClient,支持发送请求和关闭客户端;

3、HttpClient默认使用PoolingHttpClientConnectionManager,用于管理http连接;

4、HttpClient默认使用ManagedHttpClientConnectionFactory,用于创建http连接;

5、HttpClient默认使用DefaultManagedHttpClientConnection,用于代理http连接;

6、HttpClient默认使用DefaultHttpClientConnectionOperator,用于建立网络连接;

7、HttpClient默认使用HttpClientContext,每次发起网络请求时,创建一个执行环境;

8、一个会话多个请求手动传入执行环境,避免了重复创建开销,但不能在多线程环境使用;

9、HttpClient默认使用InternalExecRuntime,每次发起网络请求时,创建一个执行运行时;

10、connManager.lease获取一个代理连接,connManager.connect建立网络连接;

11、httpClient.close默认会调用connManager.close;


并发配置说明:

1、HttpRoute网络路由,有两种组成方式,协议+域名+端口,协议+IP+端口;

2、connManagerBuilder.setMaxConnTotal(int),设置最大连接数量,默认25个连接;

3、connManagerBuilder.setMaxConnPerRoute(int),设置每路由最大连接数量,默认5个连接;

4、PoolConcurrencyPolicy包含两种模式,STRICT严格模式,LAX宽松模式,默认使用严格模式;

5、严格模式限制maxConnTotal和maxConnPerRoute,宽松模式目前只限制maxConnPerRoute

6、PoolReusePolicy连接复用模式,LIFO后进先出模式,FIFO先进先出模式,默认LIFO;


Http1Config示例:

Http1Config h1Config = Http1Config.custom()
.setMaxHeaderCount(200)
.setMaxLineLength(2000)
.build();


并发配置示例:

PoolingHttpClientConnectionManagerBuilder.create()
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
.setConnPoolPolicy(PoolReusePolicy.LIFO)
.setMaxConnTotal(200)
.setMaxConnPerRoute(100)

.build();


三、httpclient连接设置

1、RequestConfig.connectionRequestTimeout从连接池获取连接超时时间,默认3分钟;

2、RequestConfig.responseTimeout等待数据超时时间,默认无设置;

3、RequestConfig.connectionKeepAlive连接最长存活时间,默认3分钟;

4、ConnectionConfig.connectTimeout建立连接超时时间,默认3分钟;

5、ConnectionConfig.socketTimeout等待数据超时时间,默认无设置;

6、ConnectionConfig.validateAfterInactivity非活跃多久需要验证,默认2秒;

7、ConnectionConfig.timeToLive连接最长存活时间,默认无设置;

8、SocketConfig.soTimeout等待数据超时时间,默认3分钟;

9、SocketConfig.tcpNoDelay数据直接发送到网络环境,默认true;

10、connectionKeepAlive、timeToLive共同限制连接存活时间,检测逻辑独立,无优先级问题;

11、responseTimeout、socketTimeout、soTimeout共同限制等待数据超时时间,优先级依次降低;


请求设置示例:

RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofMilliseconds(5000))
.setResponseTimeout(Timeout.ofMilliseconds(5000))
.setConnectionKeepAlive(TimeValue.ofMinutes(3))
.build();


连接设置示例:

ConnectionConfig.custom()
.setConnectTimeout(Timeout.ofMilliseconds(5000))
.setSocketTimeout(Timeout.ofMilliseconds(5000))
.setValidateAfterInactivity(Timeout.ofSeconds(10))
.setTimeToLive(Timeout.ofMinutes(30))
.build();


网络设置示例:

SocketConfig.custom()
.setSoTimeout(Timeout.ofMinutes(3))
.setTcpNoDelay(true)
.build();

发表评论
评论通过审核之后才会显示。