package com.fastwork.bm.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; /** * @description Http工具类 */ public class HttpKit { /** * 封装http请求返回的结果 */ public static class ResponseResult{ //网络状态码 private int statusCode = -1; //响应结果的contentType private String contentType = null; //响应结果字符串 private String body = null; public ResponseResult(int statusCode, String contentType, String body) { this.statusCode = statusCode; this.contentType = contentType; this.body = body; } public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } } private static Logger log = Logger.getLogger(HttpKit.class); private static PoolingHttpClientConnectionManager cm = null; private static RequestConfig rc = null; private static final String ENCODING = "UTF-8"; static { cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(300); //连接池最大连接数 cm.setDefaultMaxPerRoute(60); //最大路由数,即每个域名domain可以使用的连接数,默认2 rc = RequestConfig.custom().setConnectTimeout(5 * 1000) // 请求超时时间 .setSocketTimeout(60 * 1000) // 等待数据超时时间,即在该时间段内此http连接可向目标服务器发送多个请求 .setConnectionRequestTimeout(1000) // 连接池等待超时时间,如不设置该时间将一直等待,可能造成线程堵塞 .build(); } private HttpKit(){} /** * 通过连接池获取HttpClient */ private static CloseableHttpClient getHttpClient() { return HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(rc).build(); } public static ResponseResult get(String url) { return get(url,null,null); } public static ResponseResult get(String url, Map<String, Object> params) { return get(url,params,null); } /**通过get方式发起请求 * @param url 请求地址 * @param headers 请求头 * @param params 请求参数 * @return */ public static ResponseResult get(String url, Map<String, Object> headers, Map<String, Object> params) { URIBuilder ub = new URIBuilder().setPath(url); if(params != null){ ub.setParameters(covertParams2NVPS(params)); } try { HttpGet httpGet = new HttpGet(ub.build()); if(headers != null){ for (Map.Entry<String, Object> header : headers.entrySet()) { httpGet.addHeader(header.getKey(), String.valueOf(header.getValue())); } } return getResult(httpGet); } catch (URISyntaxException e) { throw new RuntimeException(e); } } public static ResponseResult post(String url) { return post(url,null,null); } public static ResponseResult post(String url, Map<String, Object> params) { return post(url,params,null); } /**通过post方式发起请求 * @param url 请求地址 * @param headers 请求头 * @param params 请求参数 * @return */ public static ResponseResult post(String url, Map<String, Object> headers, Map<String, Object> params) { URIBuilder ub = new URIBuilder().setPath(url); try { HttpPost httpPost = new HttpPost(ub.build()); if(params != null){ httpPost.setEntity(new UrlEncodedFormEntity(covertParams2NVPS(params), ENCODING)); } if(headers != null){ for (Map.Entry<String, Object> header : headers.entrySet()) { httpPost.addHeader(header.getKey(), String.valueOf(header.getValue())); } } return getResult(httpPost); } catch (URISyntaxException | UnsupportedEncodingException e) { throw new RuntimeException(e); } } private static ArrayList<NameValuePair> covertParams2NVPS(Map<String, Object> params) { ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>(); for (Map.Entry<String, Object> param : params.entrySet()) { pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue()))); } return pairs; } private static ResponseResult getResult(HttpRequestBase request) { HttpEntity entity = null; CloseableHttpClient httpClient = getHttpClient(); try(CloseableHttpResponse response = httpClient.execute(request)){ entity = response.getEntity(); return new ResponseResult( response.getStatusLine().getStatusCode(), entity.getContentType().getValue(), EntityUtils.toString(entity,ENCODING)); } catch (IOException e) { throw new RuntimeException("发起http请求的时候发生异常,目标地址["+request.getURI()+"]", e); }finally{ consume(entity); } } private static void consume(HttpEntity entity){ try { EntityUtils.consume(entity); } catch (IOException e) { log.error("释放http连接的时候发生异常", e); } } }
httpclient 版本 4.41,如有不足处请多多指教
相关推荐
HTTPClient工具类,完整,HTTPClient工具类,完整,HTTPClient工具类,完整HTTPClient工具类,完整,HTTPClient工具类,完整
HttpClientHelper 是一个C#编写的工具类,主要目的是简化HTTP客户端操作,提供同步和异步的请求方法,返回数据格式多样,包括字符串、泛型类型和XML。在爬虫开发中,这样的工具类非常实用,因为爬虫经常需要与各种...
java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient ...
HttpClient工具类是Java开发中常用的一个HTTP客户端库,主要用于发送HTTP请求并接收响应。这个工具类通常是开发者为了方便地调用HttpClient库而封装的一系列静态方法。HttpClient支持各种HTTP方法,如GET、POST、PUT...
在这个`httpclient4.3工具类`中,我们看到的是一个自定义的`httpclientUtils`,它是为了满足特定项目需求而编写的,集成了常见的HTTP操作。 HttpClient 4.3主要知识点包括: 1. **连接管理**:HttpClient 4.3引入...
7. **EntityUtils**:一个工具类,用于处理响应实体,如读取响应内容。例如: ```java String responseBody = EntityUtils.toString(response.getEntity()); ``` 8. **HttpContext**:提供了请求执行的上下文...
1.高效简单池化的HttpClient工具类,提供单元测试用列。 2.支持基于SpringBoot 2.1.x的自动装载模块,引用依赖即可使用。 3.公司几十个项目都使用该工具类访问第三方的Http/Https+json协议接口。 4.经过上市公司多个...
httpClientUtil工具类
总之,这个HttpClient工具类提供了一个简洁易用的接口,帮助开发者快速、方便地进行HTTP请求,无论是在进行API调用还是数据交互,都能大大简化工作流程。通过这个工具类,你无需深入了解HttpClient的底层实现,只需...
在本文中,我们将深入探讨HttpClient工具类的创建与使用,以及如何自定义返回的对象。 首先,我们需要引入HttpClient的相关依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache...
httpClient 工具类,简化请求开发,拿来即用,我用在SpringBoot框架;对于依赖,你可以根据包名导入。
9. **重试策略**:对于可能出现的网络不稳定情况,封装工具类可能会包含一个自动重试机制,如果请求失败,会根据预设的策略进行重试,增加请求的成功率。 10. **日志记录**:为了便于调试和监控,工具类可能集成了...
4.5.2--修改版,用注释的形式加入了maven的依赖代码;
在实际项目中,通常会封装一个HttpClient工具类,将上述操作抽象成便捷的方法,方便其他代码调用。文件`httpClientUtil`可能就是这样一个工具类,包含了上述功能的实现。通过阅读和理解这个工具类的代码,我们可以更...
基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...
下面我们将详细讨论HttpClientUtil工具类如何实现这些功能。 首先,HttpClientUtil工具类通常会封装HttpClient的基本操作,以便于开发者在应用中便捷地调用。GET和POST请求是HTTP协议中最常见的两种请求方法。GET...