httpclient4.x 使用连接池发送https请求使用总结

由于项目中需要用httpclient进行内部服务请求处理,但之前没有是用httpclient中提供的连接池,而是自己封装的一个类似池的结构,一段时间后产生了性能问题,转而尝试通过是用httpclient内部的池进行处理,而且需要支持https的连接。
     所使用的httpclient的版本为4.4.1,一共用到了三个jar:httpclient-4.4.1.jar、httpclient-cache-4.4.1.jar、httpcore-4.4.1.jar。
    所使用的连接池管理器的类为PoolingHttpClientConnectionManager,但httpclient部分参数,包括池的大小,最大路由,缓存,超时这些参数还未做深入研究;
     上代码:
      
Java代码   收藏代码
  1.   初始化代码:  
  2.      public void init()  
  3.  {  
  4.    try {  
  5.    //需要通过以下代码声明对https连接支持  
  6.    SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null,  
  7.                    new TrustSelfSignedStrategy())  
  8.            .build();  
  9.    HostnameVerifier hostnameVerifier = SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;  
  10.    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(  
  11.            sslcontext,hostnameVerifier);  
  12.    Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  
  13.            .register("http", PlainConnectionSocketFactory.getSocketFactory())  
  14.            .register("https", sslsf)  
  15.            .build();  
  16.    //初始化连接管理器  
  17.    poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  
  18.    // Increase max total connection to 200  
  19.    poolConnManager.setMaxTotal(maxTotalPool);  
  20.    // Increase default max connection per route to 20  
  21.    poolConnManager.setDefaultMaxPerRoute(maxConPerRoute);  
  22.   } catch (KeyManagementException e) {  
  23.    // TODO Auto-generated catch block  
  24.    e.printStackTrace();  
  25.   } catch (NoSuchAlgorithmException e) {  
  26.    // TODO Auto-generated catch block  
  27.    e.printStackTrace();  
  28.   } catch (KeyStoreException e) {  
  29.    // TODO Auto-generated catch block  
  30.    e.printStackTrace();  
  31.   }  
  32.  }  
  33. //获取连接  
  34.  public CloseableHttpClient getConnection()  
  35.  {  
  36.       CloseableHttpClient httpClient = HttpClients.custom()  
  37. .setConnectionManager(poolConnManager).build();   
  38.       return httpClient;  
  39.  }  
  40. //发送请求 url为请求url,jsonstr为请求参数  
  41. public String post(String url, String jsonStr)  
  42.  {  
  43.   String returnStr = null;  
  44.   //参数检测  
  45.   if(url==null||"".equals(url))  
  46.   {  
  47.    return returnStr;  
  48.   }  
  49.   try {  
  50.    HttpPost httpPost = new HttpPost(url);  
  51.    List <NameValuePair> nvps = new ArrayList <NameValuePair>();  
  52.    //设置post参数对  
  53.    nvps.add(new BasicNameValuePair("jsonstr", jsonStr));  
  54.    //设置编码,如果包含中文,一定要进行设置,否则按照系统默认字符集进行转码会出现乱码  
  55.    httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));  
  56.    CloseableHttpResponse response = client.execute(httpPost);  
  57.    //获取响应状态码  
  58.    int status = response.getStatusLine().getStatusCode();  
  59.             if (status >= 200 && status < 300) {  
  60.                 HttpEntity entity = response.getEntity();  
  61.                 return entity != null ? EntityUtils.toString(entity,"utf-8") : null;  
  62.             } else {  
  63.                 throw new ClientProtocolException("Unexpected response status: " + status);  
  64.             }  
  65.   } catch (UnsupportedEncodingException e) {  
  66.    // TODO Auto-generated catch block  
  67.    e.printStackTrace();  
  68.   } catch (ClientProtocolException e) {  
  69.    // TODO Auto-generated catch block  
  70.    e.printStackTrace();  
  71.   } catch (IOException e) {  
  72.    // TODO Auto-generated catch block  
  73.    e.printStackTrace();  
  74.   }  
  75.   //相应返回值  
  76.   return returnStr;  
  77.  } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用HttpClient发送HTTPS请求并配置连接池,可以按照以下步骤进行: 1. 创建SSLContext对象,用于HTTPS连接的安全认证。 ```java SSLContext sslContext = SSLContexts.createSystemDefault(); ``` 2. 创建ConnectionSocketFactory对象,用于连接池中的连接创建。 ```java SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext); ``` 3. 创建HttpClientConnectionManager对象,用于管理连接池中的连接。 ```java PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(Arrays.asList(sslConnectionSocketFactory)); poolingHttpClientConnectionManager.setMaxTotal(200);//设置最大连接数 poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);//设置每个路由最大连接数 ``` 4. 创建HttpClient对象,并设置连接池管理器。 ```java CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(poolingHttpClientConnectionManager) .build(); ``` 5. 创建HttpPost对象,设置请求参数,并执行请求。 ```java HttpPost httpPost = new HttpPost("https://example.com/path"); httpPost.setEntity(new StringEntity("Hello, world!")); CloseableHttpResponse httpResponse = httpClient.execute(httpPost); ``` 完整的示例代码如下: ```java import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; 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.ssl.SSLContexts; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import javax.net.ssl.SSLContext; import java.util.Arrays; import java.io.IOException; public class HttpClientExample { public static void main(String[] args) throws IOException { SSLContext sslContext = SSLContexts.createSystemDefault(); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext); PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(Arrays.asList(sslConnectionSocketFactory)); poolingHttpClientConnectionManager.setMaxTotal(200); poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(poolingHttpClientConnectionManager) .build(); HttpPost httpPost = new HttpPost("https://example.com/path"); httpPost.setEntity(new StringEntity("Hello, world!")); CloseableHttpResponse httpResponse = httpClient.execute(httpPost); System.out.println(httpResponse.getStatusLine().getStatusCode()); httpResponse.close(); httpClient.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值