`

分享一个自己 写的httpclient工具类

 
阅读更多
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工具类,完整,HTTPClient工具类,完整

    HttpClientHelper 工具类

    HttpClientHelper 是一个C#编写的工具类,主要目的是简化HTTP客户端操作,提供同步和异步的请求方法,返回数据格式多样,包括字符串、泛型类型和XML。在爬虫开发中,这样的工具类非常实用,因为爬虫经常需要与各种...

    java httpClient 工具类 java httpClient 工具类

    java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient ...

    HttpClient工具类

    HttpClient工具类是Java开发中常用的一个HTTP客户端库,主要用于发送HTTP请求并接收响应。这个工具类通常是开发者为了方便地调用HttpClient库而封装的一系列静态方法。HttpClient支持各种HTTP方法,如GET、POST、PUT...

    httpclient4.3工具类

    在这个`httpclient4.3工具类`中,我们看到的是一个自定义的`httpclientUtils`,它是为了满足特定项目需求而编写的,集成了常见的HTTP操作。 HttpClient 4.3主要知识点包括: 1. **连接管理**:HttpClient 4.3引入...

    Android HttpClient工具类

    7. **EntityUtils**:一个工具类,用于处理响应实体,如读取响应内容。例如: ```java String responseBody = EntityUtils.toString(response.getEntity()); ``` 8. **HttpContext**:提供了请求执行的上下文...

    高效池化-JAVA-HttpClient工具类

    1.高效简单池化的HttpClient工具类,提供单元测试用列。 2.支持基于SpringBoot 2.1.x的自动装载模块,引用依赖即可使用。 3.公司几十个项目都使用该工具类访问第三方的Http/Https+json协议接口。 4.经过上市公司多个...

    httpClientUtil工具类

    httpClientUtil工具类

    HttpClient接口调用工具类(附带demo)

    总之,这个HttpClient工具类提供了一个简洁易用的接口,帮助开发者快速、方便地进行HTTP请求,无论是在进行API调用还是数据交互,都能大大简化工作流程。通过这个工具类,你无需深入了解HttpClient的底层实现,只需...

    httpclient 工具类

    在本文中,我们将深入探讨HttpClient工具类的创建与使用,以及如何自定义返回的对象。 首先,我们需要引入HttpClient的相关依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache...

    httpClient 工具类

    httpClient 工具类,简化请求开发,拿来即用,我用在SpringBoot框架;对于依赖,你可以根据包名导入。

    httpclient4.3 封装工具类

    9. **重试策略**:对于可能出现的网络不稳定情况,封装工具类可能会包含一个自动重试机制,如果请求失败,会根据预设的策略进行重试,增加请求的成功率。 10. **日志记录**:为了便于调试和监控,工具类可能集成了...

    HttpClient工具类(修改)

    4.5.2--修改版,用注释的形式加入了maven的依赖代码;

    httpClient工具类

    在实际项目中,通常会封装一个HttpClient工具类,将上述操作抽象成便捷的方法,方便其他代码调用。文件`httpClientUtil`可能就是这样一个工具类,包含了上述功能的实现。通过阅读和理解这个工具类的代码,我们可以更...

    HttpClient 4.5 封装的工具类 HttpUtil 可用于爬虫和模拟登陆

    基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    下面我们将详细讨论HttpClientUtil工具类如何实现这些功能。 首先,HttpClientUtil工具类通常会封装HttpClient的基本操作,以便于开发者在应用中便捷地调用。GET和POST请求是HTTP协议中最常见的两种请求方法。GET...

Global site tag (gtag.js) - Google Analytics