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

支持https和http连接池的HttpClientUtil

阅读更多
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.suning.ppms.util.exception.ExceptionTraceUtil;
import com.suning.ppms.util.regex.RegexUtil;

/**
 * http交互工具类
 */
public class HttpClientUtil {

    protected static final Logger                           logger                          = LoggerFactory.getLogger(HttpClientUtil.class);

    public static final String                              METHOD_POST                     = "POST";
    public static final String                              METHOD_GET                      = "GET";
    public static final String                              DEFAULT_CHARSET                 = "utf-8";
    public static final String                              DEFAULT_CONTENT_TYPE            = "application/json;charset=UTF-8";
    public static final int                                 DEFAULT_CONNECT_TIMEOUT         = 5000;
    public static final int                                 DEFAULT_READ_TIMEOUT            = 5000;
    public static final int                                 DEFAULT_CONNECT_REQUEST_TIMEOUT = 5000;

    private static final int                                MAX_TOTAL                       = 64;

    private static final int                                MAX_PER_ROUTE                   = 32;

    private static final RequestConfig                      requestConfig;

    private static final PoolingHttpClientConnectionManager connectionManager;

    private static final HttpClientBuilder                  httpBuilder;

    private static final CloseableHttpClient                httpClient;
    
    private static final CloseableHttpClient                httpsClient;

    private static SSLContext               				sslContext						 = null;

    static {
    	
        try {
            sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                //信任所有
                @Override
                public boolean isTrusted(X509Certificate[] xcs, String string){
                    return true;
                }
            }).build();
        } catch (KeyStoreException ex) {
        	logger.error(ex.getMessage(), ex);
        } catch (NoSuchAlgorithmException ex) {
        	logger.error(ex.getMessage(), ex);
        } catch (KeyManagementException ex) {
        	logger.error(ex.getMessage(), ex);
        }
    }
    
    static {
        requestConfig = RequestConfig.custom().setSocketTimeout(DEFAULT_READ_TIMEOUT).setConnectTimeout(DEFAULT_CONNECT_TIMEOUT).setConnectionRequestTimeout(DEFAULT_CONNECT_REQUEST_TIMEOUT).build();
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
        		.register("http", new PlainConnectionSocketFactory())
        		.register("https", new SSLConnectionSocketFactory(sslContext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
                .build();
        connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        connectionManager.setMaxTotal(MAX_TOTAL);
        connectionManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);
        httpBuilder = HttpClientBuilder.create();
        httpBuilder.setDefaultRequestConfig(requestConfig);
        httpBuilder.setConnectionManager(connectionManager);
        httpClient = httpBuilder.build();
        httpsClient = httpBuilder.build();
    }
    
    

    private HttpClientUtil() {

    }

    public static String get(String url, Map<String, String> headers) {
        HttpGet request = new HttpGet(url);
        try {
            wrapHeader(request, headers);// 设置请求头
            return RegexUtil.isHttps(url) ? execute(request,httpsClient): execute(request,httpClient);
        } catch (Exception e) {
            ExceptionTraceUtil.trace("409", "01", "101", e, url, headers);
            logger.error(e.getMessage(), e);
        } finally {
            request.releaseConnection();
        }
        return null;
    }

    public static String postBody(String url,
                                  String body,
                                  Map<String, String> headers) {
        HttpPost request = new HttpPost(url);
        try {
            wrapHeader(request, headers);// 设置请求头
            wrapStringEntity(request, body);// 设置body
            return RegexUtil.isHttps(url) ? execute(request,httpsClient): execute(request,httpClient);
        } catch (Exception e) {
            ExceptionTraceUtil.trace("409", "01", "102", e, url, body, headers);
            logger.error(e.getMessage(), e);
        } finally {
            request.releaseConnection();
        }
        return null;
    }

    public static String postForm(String url,
                                  Map<String, String> params,
                                  Map<String, String> headers) {
        HttpPost request = new HttpPost(url);
        try {
            wrapHeader(request, headers);// 设置请求头
            wrapFormEntity(request, params);
            return RegexUtil.isHttps(url) ? execute(request,httpsClient): execute(request,httpClient);
        } catch (Exception e) {
            ExceptionTraceUtil.trace("409", "01", "103", e, url, params, headers);
            logger.error(e.getMessage(), e);
        } finally {
            request.releaseConnection();
        }
        return null;
    }

    private static String execute(HttpRequestBase request, CloseableHttpClient httpClient) {
        String respJson = null;
        try (CloseableHttpResponse response = httpClient.execute(request);) {
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                HttpEntity httpEntity = response.getEntity();
                respJson = EntityUtils.toString(httpEntity, DEFAULT_CHARSET);
                EntityUtils.consume(httpEntity);
            }
        } catch (Exception e) {
            ExceptionTraceUtil.trace("409", "01", "104", e, request);
            logger.error(e.getMessage(), e);
        }
        return respJson;
    }
    
    private static void wrapHeader(HttpRequestBase request,
                                   Map<String, String> headers) {
        // 设置请求头
        if (null != headers) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                request.addHeader(entry.getKey(), entry.getValue());
            }
        }
    }

    private static void wrapStringEntity(HttpPost request,
                                         String body) {
        // 设置body
        if (body != null) {
            StringEntity entity = new StringEntity(body, DEFAULT_CHARSET);// 解决中文乱码问题
            entity.setContentEncoding(DEFAULT_CHARSET);
            request.setEntity(entity);
        }
    }

    private static void wrapFormEntity(HttpPost request,
                                       Map<String, String> params) throws UnsupportedEncodingException {
        if (params != null) {
            List<NameValuePair> nvps = new ArrayList<>();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
            request.setEntity(new UrlEncodedFormEntity(nvps, DEFAULT_CHARSET));
        }
    }
}
 

 

分享到:
评论

相关推荐

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

    3. 支持http和https:HttpClientUtil需要能够处理HTTP和HTTPS协议。HTTP协议不涉及数据加密,而HTTPS协议在HTTP的基础上加入了SSL/TLS层,提供数据加密和服务器身份验证,确保通信安全。HttpClient支持SSL/TLS,只需...

    HttpClientUtil工具类 里面包含GET POST 及返回值处理

    - **连接管理**:为了防止过多的并发连接导致资源耗尽,HttpClientUtil可能包含连接池管理,需要合理配置连接池大小和超时时间。 - **异常处理**:在使用HttpClientUtil时,应捕获可能出现的IOException或其他网络...

    HttpClientUtil

    1. **连接管理**:HttpClientUtil可以配置连接池,复用已建立的连接,提高性能,避免频繁的TCP三次握手和四次挥手。 2. **线程安全**:为了支持多线程环境,HttpClientUtil通常设计为线程安全的,这意味着多个线程...

    http请求工具类HttpClientUtil,get,post请求(csdn)————程序.pdf

    - 支持各种 HTTP 特性,如重定向、cookies、HTTP/1.1、HTTPS、连接池管理等。 - 提供了丰富的 API 用于创建和配置请求,处理响应,以及对请求头和实体的精细控制。 - 可以处理异步请求,提高性能和响应速度。 8....

    httpclient.jar包下载

    1. **连接管理**:HttpClient通过HttpConnectionManager接口控制HTTP连接的创建、复用和关闭,有效地管理连接池,避免了频繁建立新连接带来的性能开销。 2. **请求和响应模型**:HttpClient使用HttpRequest和...

    HttpClientUtil:一个Http请求使用HttpClient访问服务器,我们也可以上传文件到服务器,比如文件或图片。它提供接口来更新你的上传进度

    HttpClientUtil 是一个基于 Java 的工具类,用于执行 HTTP 请求并支持向服务器上传文件,如普通文件和图片。HttpClient 是 Apache 开源基金会提供的一个强大的 HTTP 客户端库,它允许开发者构建复杂的网络交互应用。...

    HttpClient依赖jar包.zip

    3. **连接管理**:HttpClient提供了连接池和连接管理机制,可以优化并发请求的性能,减少建立新连接的开销。 4. **支持SSL/TLS**:HttpClient内置了对HTTPS的支持,可以处理SSL证书验证,确保数据传输的安全性。 5...

    HttpClient框架所需的jar包和一个简单实例

    - 配置连接池:可以通过HttpClientBuilder定制连接池的大小和超时时间。 - 身份验证:使用BasicScheme或DigestScheme进行HTTP基本认证或摘要认证。 - 重试策略:当请求失败时,可以配置HttpClient自动重试。 - 遵循...

    httpUtil httpclient 登陆携带cookie访问下一个连接

    可以使用`HttpClientBuilder`来定制各种设置,如超时时间、重试策略、连接池等。 3. **执行请求**:调用`HttpClient`的`execute`方法,传入`HttpPost`对象,得到`HttpResponse`。这将返回服务器的响应,包括状态码...

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

    高效的HTTP请求需要良好的连接管理,HttpClient提供了`PoolingHttpClientConnectionManager`来管理连接池,提高性能和并发能力。 9. **安全性**: HttpClient还可以处理HTTPS连接,支持SSL/TLS协议,确保数据传输...

    httpclient.jar4.4及4.5版本和httpcore.jar和commons-logging.jar.rar

    HTTPClient 4.x版本是HTTPClient的最新稳定版,它提供了许多功能和改进,包括对HTTP/1.1和部分HTTP/2协议的支持,支持多种认证机制,连接管理和池化,以及重试策略等。HTTPClient 4.4和4.5之间的主要差异可能在于...

    HttpClient工具类

    - HttpClient管理连接池,可以优化并发请求性能,同时其API设计考虑了线程安全,允许多线程环境中使用。 9. **响应处理** - 响应实体可以用EntityUtils类进行解析,如转换为字符串、字节数组或特定类型对象。 - ...

    HttpClient+ Spring实现多线程

    标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来...通过正确配置和管理连接池,可以有效控制并发量,防止资源耗尽,同时利用Spring的容器特性简化代码和提高可维护性。

    httpClient工具类

    HttpClient支持连接池管理,通过PoolingHttpClientConnectionManager可以创建并配置连接池,提高性能和效率。 7. **上传文件**: 对于文件上传,可以使用MultipartEntityBuilder创建多部分实体,添加FileBody来...

    Client-https-server.rar_httpclient服务器_https_https client_https c

    Apache HttpClient是一个功能强大的HTTP客户端实现,支持多种HTTP方法(GET、POST等),支持连接池,以及各种认证和重试策略。对于HTTPS,HttpClient提供了配置SSL上下文(SSLContext)的能力,以便与HTTPS服务器...

    httpclient所需jar包

    HttpClient库提供了丰富的API,允许开发者执行各种类型的HTTP操作,如GET、POST、PUT、DELETE等,同时还支持HTTPS、Cookie管理、重定向处理、连接池管理等功能。 在"描述"中提到的`httpclientutil工具类`,通常是指...

    httpclient-4.5.2.jar

    HttpCore库是HttpClient的基础,提供了低级别的网络通信接口,包括连接池管理、HTTP/1.1协议支持等,是HttpClient能够高效工作的基石。 然后,`commons-codec-1.9.jar`是Apache Commons Codec库,它包含了各种编码...

    httpclient jar包

    1. **多协议支持**:HttpClient支持HTTP/1.0和HTTP/1.1协议,同时具备处理HTTPS的能力。 2. **连接管理**:HttpClient允许用户自定义连接池,控制并发连接数,提高性能。 3. **请求和响应处理**:提供丰富的API来...

    HttpClient3.1.jar

    - **配置连接管理器**:为了有效地管理HTTP连接,HttpClient提供了`HttpConnectionManager`接口,通过它可以设置连接池大小、超时时间等参数。 - **处理重定向和重试**:HttpClient允许用户配置如何处理HTTP状态码3...

    httpclient相关jar包

    `commons-httpclient`库还支持HTTPS、代理服务器、连接池、Cookie管理、重定向处理、身份验证等多种功能。开发者可以通过设置各种配置参数来定制HTTP请求的行为,以适应不同的网络环境和应用需求。 在`commons-...

Global site tag (gtag.js) - Google Analytics