http请求pom 客户端_org.apache.http.client.HttpClient使用方法

本文档详细介绍了如何使用 Apache HttpClient 进行 HTTP 请求,包括 GET 和 POST 方法的实现,参数与头信息的设置,以及自定义请求重试处理器。示例代码展示了如何创建 HttpClient 实例,设置超时时间,并处理各种异常情况。
摘要由CSDN通过智能技术生成

packagecom.feilong.reptile.util;importjava.io.IOException;importjava.io.InterruptedIOException;importjava.net.UnknownHostException;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjavax.net.ssl.SSLException;importorg.apache.commons.codec.Charsets;importorg.apache.http.Header;importorg.apache.http.HttpEntityEnclosingRequest;importorg.apache.http.HttpRequest;importorg.apache.http.HttpResponse;importorg.apache.http.client.HttpClient;importorg.apache.http.client.HttpRequestRetryHandler;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.client.protocol.HttpClientContext;importorg.apache.http.client.utils.URIBuilder;importorg.apache.http.config.SocketConfig;importorg.apache.http.conn.ConnectTimeoutException;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.impl.conn.PoolingHttpClientConnectionManager;importorg.apache.http.protocol.HttpContext;importorg.apache.http.util.EntityUtils;/*** 使用HttpClient发送和接收Http请求

*

*@authormanzhizhen

**/

public classHttpUtils {private staticHttpClient httpClient;//最大连接数

private static final int MAX_CONNECTION = 100;//每个route能使用的最大连接数,一般和MAX_CONNECTION取值一样

private static final int MAX_CONCURRENT_CONNECTIONS = 100;//建立连接的超时时间,单位毫秒

private static final int CONNECTION_TIME_OUT = 1000;//请求超时时间,单位毫秒

private static final int REQUEST_TIME_OUT = 1000;//最大失败重试次数

private static final int MAX_FAIL_RETRY_COUNT = 3;//请求配置,可以复用

private staticRequestConfig requestConfig;static{

SocketConfig socketConfig=SocketConfig.custom()

.setSoTimeout(REQUEST_TIME_OUT).setSoKeepAlive(true)

.setTcpNoDelay(true).build();

requestConfig=RequestConfig.custom()

.setSocketTimeout(REQUEST_TIME_OUT)

.setConnectTimeout(CONNECTION_TIME_OUT).build();/*** 每个默认的 ClientConnectionPoolManager 实现将给每个route创建不超过2个并发连接,最多20个连接总数。*/PoolingHttpClientConnectionManager connManager= newPoolingHttpClientConnectionManager();

connManager.setMaxTotal(MAX_CONNECTION);

connManager.setDefaultMaxPerRoute(MAX_CONCURRENT_CONNECTIONS);

connManager.setDefaultSocketConfig(socketConfig);

httpClient=HttpClients.custom().setConnectionManager(connManager)//添加重试处理器

.setRetryHandler(newMyHttpRequestRetryHandler()).build();

}public static voidmain(String[] args) {

testGet();

}/*** 测试get方法*/

private static voidtestGet() {

String url= "http://restapi.amap.com/v3/place/text";

Map paramMap = new HashMap();

paramMap.put("key", "95708f902ac2428ea119ec99fb70e6a3");

paramMap.put("keywords", "互联网金融大厦");

paramMap.put("city", "330100");

paramMap.put("extensions", "all");try{

System.out.println(get(url, paramMap));

}catch(Exception e) {

e.printStackTrace();

}

}/*** post请求

*

*@paramurl

*@paramparamMap

*@paramheaders

*@return*@throwsException*/

public static String post(String url, MapparamMap,

List headers) throwsException {

URIBuilder uriBuilder= newURIBuilder(url);if (paramMap != null) {//添加请求参数

for (Entryentry : paramMap.entrySet()) {

uriBuilder.addParameter(entry.getKey(), entry.getValue());

}

}

HttpPost httpPost= newHttpPost(uriBuilder.build());if (headers != null) {//添加请求首部

for(Header header : headers) {

httpPost.addHeader(header);

}

}

httpPost.setConfig(requestConfig);//执行请求

HttpResponse response =httpClient.execute(httpPost);returnEntityUtils.toString(response.getEntity(), Charsets.UTF_8);

}/*** post请求,不带请求首部

*

*@paramurl

*@paramparamMap

*@return*@throwsException*/

public static String post(String url, MapparamMap)throwsException {return post(url, paramMap, null);

}/*** get请求

*

*@paramurl

*@paramparamMap

*@paramheaders

*@return*@throwsException*/

public static String get(String url, MapparamMap,

List headers) throwsException {

URIBuilder uriBuilder= newURIBuilder(url);if (paramMap != null) {//添加请求参数

for (Entryentry : paramMap.entrySet()) {

uriBuilder.addParameter(entry.getKey(), entry.getValue());

}

}

HttpGet httpGet= newHttpGet(uriBuilder.build());if (headers != null) {//添加请求首部

for(Header header : headers) {

httpGet.addHeader(header);

}

}

httpGet.setConfig(requestConfig);//执行请求

HttpResponse response =httpClient.execute(httpGet);returnEntityUtils.toString(response.getEntity(), Charsets.UTF_8);

}/*** get请求,不带请求首部

*

*@paramurl

*@paramparamMap

*@return*@throwsException*/

public static String get(String url, MapparamMap)throwsException {return get(url, paramMap, null);

}/*** 请求重试处理器

*@authormanzhizhen

**/

private static class MyHttpRequestRetryHandler implementsHttpRequestRetryHandler {

@Overridepublic boolean retryRequest(IOException exception, intexecutionCount,

HttpContext context) {if (executionCount >=MAX_FAIL_RETRY_COUNT) {return false;

}if (exception instanceofInterruptedIOException) {//超时

return false;

}if (exception instanceofUnknownHostException) {//未知主机

return false;

}if (exception instanceofConnectTimeoutException) {//连接被拒绝

return false;

}if (exception instanceofSSLException) {//SSL handshake exception

return false;

}

HttpClientContext clientContext=HttpClientContext.adapt(context);

HttpRequest request=clientContext.getRequest();boolean idempotent = !(request instanceofHttpEntityEnclosingRequest);if(idempotent) {//如果请求被认为是幂等的,则重试

return true;

}return false;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值