http方式调用webservice

Love The Way You Lie 2022-07-27 14:54 248阅读 0赞

http方式调用webservice

  1. import org.apache.commons.httpclient.HttpStatus;
  2. import org.apache.http.HttpEntity;
  3. import org.apache.http.client.methods.HttpPost;
  4. import org.apache.http.client.methods.CloseableHttpResponse;
  5. import org.apache.http.client.ClientProtocolException;
  6. import org.apache.http.entity.StringEntity;
  7. import org.apache.http.impl.client.CloseableHttpClient;
  8. import org.apache.http.util.EntityUtils;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import java.io.IOException;
  13. /**
  14. * 通过Http Post调用webservice服务
  15. *
  16. *
  17. */
  18. public class CommonWebServiceClient {
  19. private static Logger logger = LoggerFactory.getLogger(CommonWebServiceClient.class);
  20. @Autowired
  21. private CommonHttpServiceClient commonHttpServiceClient;
  22. private String requestCharSet;
  23. private String responseCharSet;
  24. /**
  25. *
  26. * @param postUrl webservice地址
  27. * @param requestXML 请求报文(soapUI工具请求报文)
  28. * @param connectionTimeout 连接超时时间
  29. * @param requestTimeout 请求超时时间
  30. * @return
  31. * @throws ClientProtocolException
  32. * @throws IOException
  33. */
  34. public String invokeService(String postUrl, String requestXML, int connectionTimeout, int requestTimeout)
  35. throws ClientProtocolException, IOException {
  36. CloseableHttpClient httpClient = commonHttpServiceClient.getConnection(connectionTimeout, requestTimeout);
  37. HttpPost httpPost = new HttpPost(postUrl);
  38. StringEntity entity = new StringEntity(requestXML, requestCharSet);
  39. httpPost.setEntity(entity);
  40. httpPost.setHeader("Content-Type", "text/xml; charset="+requestCharSet);
  41. httpPost.setHeader("SOAPAction", "");
  42. CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
  43. String result = null;
  44. int iCode = httpResponse.getStatusLine().getStatusCode();
  45. if (HttpStatus.SC_OK == iCode) {
  46. HttpEntity httpEntity = httpResponse.getEntity();
  47. result = EntityUtils.toString(httpEntity, responseCharSet);
  48. } else { // 如果返回非200,则手动关闭连接
  49. httpPost.abort();
  50. logger.info("get status code {} from server", httpResponse.getStatusLine().getStatusCode());
  51. }
  52. return result;
  53. }
  54. public void setRequestCharSet(String requestCharSet) {
  55. this.requestCharSet = requestCharSet;
  56. }
  57. public void setResponseCharSet(String responseCharSet) {
  58. this.responseCharSet = responseCharSet;
  59. }
  60. public String getRequestCharSet() {
  61. return requestCharSet;
  62. }
  63. public String getResponseCharSet() {
  64. return responseCharSet;
  65. }
  66. }

http 连接池

  1. import org.apache.commons.lang3.StringUtils;
  2. import org.apache.http.client.config.RequestConfig;
  3. import org.apache.http.config.Registry;
  4. import org.apache.http.config.RegistryBuilder;
  5. import org.apache.http.config.SocketConfig;
  6. import org.apache.http.conn.socket.ConnectionSocketFactory;
  7. import org.apache.http.conn.socket.PlainConnectionSocketFactory;
  8. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  9. import org.apache.http.conn.ssl.SSLContexts;
  10. import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
  11. import org.apache.http.conn.ssl.X509HostnameVerifier;
  12. import org.apache.http.impl.client.CloseableHttpClient;
  13. import org.apache.http.impl.client.HttpClients;
  14. import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import javax.annotation.PostConstruct;
  18. import javax.net.ssl.SSLContext;
  19. import java.net.URI;
  20. import java.util.ArrayList;
  21. import java.util.Iterator;
  22. import java.util.Map;
  23. /**
  24. *
  25. * 该类主要提供http相关的服务功能:(1)连接池
  26. */
  27. public class CommonHttpServiceClient {
  28. private final static Logger logger = LoggerFactory.getLogger(CommonHttpServiceClient.class);
  29. private static PoolingHttpClientConnectionManager poolConnManager;
  30. private int maxConnection;
  31. private int maxConnPerRoute;
  32. private int socketTimeout;
  33. @PostConstruct
  34. public void init() {
  35. try {
  36. SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null,
  37. new TrustSelfSignedStrategy())
  38. .build();
  39. X509HostnameVerifier hostnameVerifier = SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
  40. SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslcontext, hostnameVerifier);
  41. Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
  42. .register("http", PlainConnectionSocketFactory.getSocketFactory())
  43. .register("https", sslConnectionSocketFactory)
  44. .build();
  45. poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
  46. poolConnManager.setMaxTotal(getMaxConnection());
  47. poolConnManager.setDefaultMaxPerRoute(getMaxConnPerRoute());
  48. SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(getSocketTimeout()).build();
  49. poolConnManager.setDefaultSocketConfig(socketConfig);
  50. } catch (Exception e) {
  51. logger.error("catch exception when init PoolingHttpClientConnectionManager:" + e);
  52. }
  53. }
  54. public CloseableHttpClient getConnection(int connectionTimeout, int requestTimeout) {
  55. RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionTimeout)
  56. .setConnectTimeout(connectionTimeout).setSocketTimeout(requestTimeout).build();
  57. CloseableHttpClient httpClient = HttpClients.custom()
  58. .setConnectionManager(poolConnManager).setDefaultRequestConfig(requestConfig).build();
  59. if (null != poolConnManager && null != poolConnManager.getTotalStats()) {
  60. logger.info("now client pool " + poolConnManager.getTotalStats().toString());
  61. }
  62. return httpClient;
  63. }
  64. public static URI buildUri(String url, Map<String, String> parametersMap) {
  65. if (null == parametersMap || parametersMap.isEmpty()) {
  66. return URI.create(url);
  67. }
  68. ArrayList list = new ArrayList(parametersMap.size());
  69. Iterator iterator = parametersMap.entrySet().iterator();
  70. while (iterator.hasNext()) {
  71. Map.Entry entry = (Map.Entry) iterator.next();
  72. list.add(entry.getKey().toString().trim() + "=" + entry.getValue().toString().trim());
  73. }
  74. return list.isEmpty() ? URI.create(url) : URI.create(url + "?" + StringUtils.join(list, "&"));
  75. }
  76. public int getMaxConnection() {
  77. return maxConnection;
  78. }
  79. public void setMaxConnection(int maxConnection) {
  80. this.maxConnection = maxConnection;
  81. }
  82. public int getMaxConnPerRoute() {
  83. return maxConnPerRoute;
  84. }
  85. public void setMaxConnPerRoute(int maxConnPerRoute) {
  86. this.maxConnPerRoute = maxConnPerRoute;
  87. }
  88. public int getSocketTimeout() {
  89. return socketTimeout;
  90. }
  91. public void setSocketTimeout(int socketTimeout) {
  92. this.socketTimeout = socketTimeout;
  93. }
  94. }

配置文件

  1. <bean id="commonHttpServiceClient" class="com.service.client.impl.CommonHttpServiceClient">
  2. <property name="maxConnection" value="${http.connection.pool.max.connecton}"/>
  3. <property name="maxConnPerRoute" value="${http.connection.pool.max.connection.per.router}"/>
  4. <property name="socketTimeout" value="${http.connection.pool.socket.timeout}"/>
  5. </bean>

值:

  1. http.connection.pool.max.connecton=2000
  2. http.connection.pool.max.connection.per.router=50
  3. http.connection.pool.socket.timeout=5000

如果出现httpclient一段时间后首次访问缓慢,可能是由于长连接被异常关闭,选择关闭长连接使用get方式

  1. HttpGet get = new HttpGet("https://www.baidu.com");
  2. get.setHeader("Connection", "close");

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读