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)); } } }
相关推荐
3. 支持http和https:HttpClientUtil需要能够处理HTTP和HTTPS协议。HTTP协议不涉及数据加密,而HTTPS协议在HTTP的基础上加入了SSL/TLS层,提供数据加密和服务器身份验证,确保通信安全。HttpClient支持SSL/TLS,只需...
- **连接管理**:为了防止过多的并发连接导致资源耗尽,HttpClientUtil可能包含连接池管理,需要合理配置连接池大小和超时时间。 - **异常处理**:在使用HttpClientUtil时,应捕获可能出现的IOException或其他网络...
1. **连接管理**:HttpClientUtil可以配置连接池,复用已建立的连接,提高性能,避免频繁的TCP三次握手和四次挥手。 2. **线程安全**:为了支持多线程环境,HttpClientUtil通常设计为线程安全的,这意味着多个线程...
- 支持各种 HTTP 特性,如重定向、cookies、HTTP/1.1、HTTPS、连接池管理等。 - 提供了丰富的 API 用于创建和配置请求,处理响应,以及对请求头和实体的精细控制。 - 可以处理异步请求,提高性能和响应速度。 8....
1. **连接管理**:HttpClient通过HttpConnectionManager接口控制HTTP连接的创建、复用和关闭,有效地管理连接池,避免了频繁建立新连接带来的性能开销。 2. **请求和响应模型**:HttpClient使用HttpRequest和...
HttpClientUtil 是一个基于 Java 的工具类,用于执行 HTTP 请求并支持向服务器上传文件,如普通文件和图片。HttpClient 是 Apache 开源基金会提供的一个强大的 HTTP 客户端库,它允许开发者构建复杂的网络交互应用。...
3. **连接管理**:HttpClient提供了连接池和连接管理机制,可以优化并发请求的性能,减少建立新连接的开销。 4. **支持SSL/TLS**:HttpClient内置了对HTTPS的支持,可以处理SSL证书验证,确保数据传输的安全性。 5...
- 配置连接池:可以通过HttpClientBuilder定制连接池的大小和超时时间。 - 身份验证:使用BasicScheme或DigestScheme进行HTTP基本认证或摘要认证。 - 重试策略:当请求失败时,可以配置HttpClient自动重试。 - 遵循...
可以使用`HttpClientBuilder`来定制各种设置,如超时时间、重试策略、连接池等。 3. **执行请求**:调用`HttpClient`的`execute`方法,传入`HttpPost`对象,得到`HttpResponse`。这将返回服务器的响应,包括状态码...
高效的HTTP请求需要良好的连接管理,HttpClient提供了`PoolingHttpClientConnectionManager`来管理连接池,提高性能和并发能力。 9. **安全性**: HttpClient还可以处理HTTPS连接,支持SSL/TLS协议,确保数据传输...
HTTPClient 4.x版本是HTTPClient的最新稳定版,它提供了许多功能和改进,包括对HTTP/1.1和部分HTTP/2协议的支持,支持多种认证机制,连接管理和池化,以及重试策略等。HTTPClient 4.4和4.5之间的主要差异可能在于...
- HttpClient管理连接池,可以优化并发请求性能,同时其API设计考虑了线程安全,允许多线程环境中使用。 9. **响应处理** - 响应实体可以用EntityUtils类进行解析,如转换为字符串、字节数组或特定类型对象。 - ...
标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来...通过正确配置和管理连接池,可以有效控制并发量,防止资源耗尽,同时利用Spring的容器特性简化代码和提高可维护性。
HttpClient支持连接池管理,通过PoolingHttpClientConnectionManager可以创建并配置连接池,提高性能和效率。 7. **上传文件**: 对于文件上传,可以使用MultipartEntityBuilder创建多部分实体,添加FileBody来...
Apache HttpClient是一个功能强大的HTTP客户端实现,支持多种HTTP方法(GET、POST等),支持连接池,以及各种认证和重试策略。对于HTTPS,HttpClient提供了配置SSL上下文(SSLContext)的能力,以便与HTTPS服务器...
HttpClient库提供了丰富的API,允许开发者执行各种类型的HTTP操作,如GET、POST、PUT、DELETE等,同时还支持HTTPS、Cookie管理、重定向处理、连接池管理等功能。 在"描述"中提到的`httpclientutil工具类`,通常是指...
HttpCore库是HttpClient的基础,提供了低级别的网络通信接口,包括连接池管理、HTTP/1.1协议支持等,是HttpClient能够高效工作的基石。 然后,`commons-codec-1.9.jar`是Apache Commons Codec库,它包含了各种编码...
1. **多协议支持**:HttpClient支持HTTP/1.0和HTTP/1.1协议,同时具备处理HTTPS的能力。 2. **连接管理**:HttpClient允许用户自定义连接池,控制并发连接数,提高性能。 3. **请求和响应处理**:提供丰富的API来...
- **配置连接管理器**:为了有效地管理HTTP连接,HttpClient提供了`HttpConnectionManager`接口,通过它可以设置连接池大小、超时时间等参数。 - **处理重定向和重试**:HttpClient允许用户配置如何处理HTTP状态码3...
`commons-httpclient`库还支持HTTPS、代理服务器、连接池、Cookie管理、重定向处理、身份验证等多种功能。开发者可以通过设置各种配置参数来定制HTTP请求的行为,以适应不同的网络环境和应用需求。 在`commons-...