spring boot RestTemplate http请求

package com.infosec.ztpdp.policycenter.component.httpclient;

import java.security.cert.CertificateException;
import java.util.Arrays;

import javax.annotation.PostConstruct;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
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.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

/**
 * 
 * <p> 
 * redis配置
 * </p>
 *
 * <p>
 *    版权所有:北京信安世纪科技股份有限公司 (c) 2022
 * </p>
 *
 * @author jlcui
 * @date:   2023年8月22日 下午1:09:13
 *
 */
@EnableCaching
@AutoConfigureBefore(RestTemplateConfig.class)
@Configuration
public class RestTemplateConfig {
	
	/**http请求等待请求返回时间 单位毫秒 */
	@Value("${http.request.read.timeout:20000}")
	private Integer readTimeout ;
	
	/**http请求资源等待时间  单位毫秒*/
	@Value("${http.request.connection.timeout:10000}")
	private Integer connectionTimeout ;
	
	/**
	 * <p>
	 *  Description: http请求方式 
	 * </p>
	 * @param restTemplateBuilder
	 * @return
	 *  	
	 * @author  Tianzy
	 *
	 * 2020年5月18日  下午1:53:53
	 *
	 */
	@Bean("restTemplate")
    public RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(
                MediaType.TEXT_HTML,
                MediaType.TEXT_PLAIN));
        restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);

        return restTemplate;
    }

	
	@Bean
    public HttpClient httpClientPool() {
		SSLConnectionSocketFactory sslsf = null;
		try {
			sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySsl(),
			        // 指定TLS版本
			        null,
			        // 指定算法
			        null,
			        // 取消域名验证
			        new HostnameVerifier() {
			            @Override
			            public boolean verify(String string, SSLSession ssls) {
			                return true;
			            }
			        });
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslsf == null?SSLConnectionSocketFactory.getSocketFactory():sslsf)
                .build();
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        //设置整个连接池最大连接数 根据自己的场景决定
        connectionManager.setMaxTotal(200);
        //路由是对maxTotal的细分
        connectionManager.setDefaultMaxPerRoute(100);
        RequestConfig requestConfig = RequestConfig.custom()
        		//服务器返回数据(response)的时间,超过该时间抛出read timeout
                .setSocketTimeout(readTimeout)
                //连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
                .setConnectTimeout(connectionTimeout)
                //从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
                .setConnectionRequestTimeout(1000)
                .build();
        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }
	
	@PostConstruct
	private void init() {
		HttpClientUtils.httpRestTemplate = restTemplate() ;
	}
	
	/**
     * 跳过证书效验的sslcontext
     * 
     * @return
     * @throws Exception
     */
    private static SSLContext createIgnoreVerifySsl() throws Exception {
        SSLContext sc = SSLContext.getInstance("TLS");

        // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                    String paramString) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                    String paramString) throws CertificateException {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sc.init(null, new TrustManager[] { trustManager }, null);
        return sc;
    }
}

  

package com.infosec.ztpdp.policycenter.component.httpclient;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSONObject;
import com.infosec.ztpdp.policycenter.common.jsonresult.JsonResult;
import com.infosec.ztpdp.policycenter.common.util.Const;
import com.infosec.ztpdp.policycenter.common.util.SymbolConst;
import com.infosec.ztpdp.policycenter.common.util.deciphering.EncryptionFactory;
import com.infosec.ztpdp.policycenter.module.system.confignetauthdatasource.entity.ConfigNetauthDataSourceBean;
import com.infosec.ztpdp.policycenter.module.system.confignetauthdatasource.service.ConfigNetauthDataSourceService;

/**
 * <p> 
 *   策略中心调用iam工具类
 * </p>
 *
 * <p>
*    版权所有:北京信安世纪科技股份有限公司 (c) 2019
 * </p>
 *
 * @author Tianzy
 *
 * 2023年10月9日 上午10:22:25
 *
 */
@Component
public class IamInterfaceClient {
	
	@Autowired
	private RestTemplate restTemplate;
	
	@Autowired
	private ConfigNetauthDataSourceService iamService ;
	
	private final String APPID_STR = "appid" ;
	
	private final String TIMESTAMP_STR = "timestamp" ; 
	
	private final String TOKEN_STR = "token" ; 
	
	public final Integer ADMIN_SERVER = 1 ;
	
	public final Integer SSO_SERVER = 2 ;
	
	/**
	 * <p>
	 *  Description: 请求iam接口,获取json格式返回值
	 * </p>
	 * @param serverType 服务类型 1 admin  2 sso
	 * @param url
	 * @param paramMap 请求参数
	 * @param method HttpMethod.GET HttpMethod.POST
	 *  	
	 * @author  Tianzy
	 *
	 * 2023年9月28日  下午5:12:54
	 *
	 */
	public <T> JsonResult<T> getJsonResult(Integer serverType,String subUrl,Map<String, Object> paramMap,Integer requestType) 
			throws Exception{
		ConfigNetauthDataSourceBean netauthVO = iamService.findOpenIamSource() ;
		String ssoUrl = new StringBuffer().append(netauthVO.getSsoProtocol()).append(SymbolConst.COLON).append(SymbolConst.DOUBLE_SLASH)
				  .append(netauthVO.getSsoIpAddress()).append(SymbolConst.COLON).append(netauthVO.getSsoPort()).toString() ;
		String adminUrl = new StringBuffer().append(netauthVO.getAdminProtocol()).append(SymbolConst.COLON).append(SymbolConst.DOUBLE_SLASH)
				  .append(netauthVO.getAdminIpAddress()).append(SymbolConst.COLON).append(netauthVO.getAdminPort()).toString() ;
		String appId = netauthVO.getAppId() ;
		String sharekey = netauthVO.getShareKey() ;
		// 设置Http Header
		HttpHeaders headers = new HttpHeaders();
		headers.add(APPID_STR, appId);
		String thisTimestamp = String.valueOf(System.currentTimeMillis()) ;
		headers.add(TIMESTAMP_STR, thisTimestamp);
		headers.add(TOKEN_STR,EncryptionFactory.encrypt(EncryptionFactory.ALG_SHA256, sharekey + appId + thisTimestamp) );
		// 设置返回媒体数据类型
		HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(headers);
		String url = (ADMIN_SERVER == serverType ? adminUrl : ssoUrl) + subUrl ;
		ResponseEntity<JSONObject> iamResult = null ;
		if(Const.CONST_INTEGER_1 == requestType) {
			if(!CollectionUtils.isEmpty(paramMap)) {
				StringBuffer urlAndParam = new StringBuffer(url).append(SymbolConst.QUESTION) ;
				for(String key : paramMap.keySet()) {
					urlAndParam.append(SymbolConst.SINGLE_ALSO).append(key).append(SymbolConst.BE_EQUAL_TO).append(paramMap.get(key));
				}
				url = urlAndParam.toString().replaceFirst(SymbolConst.SINGLE_ALSO, SymbolConst.NULL_STR) ;
			}
			iamResult = restTemplate.exchange(url,HttpMethod.GET,httpEntity,JSONObject.class) ;
		}else {
			LinkedMultiValueMap<String, Object> paramLinkMap = new LinkedMultiValueMap<>();
			if(!CollectionUtils.isEmpty(paramMap)) {
				for(String key : paramMap.keySet()) {
					paramLinkMap.add(key, paramMap.get(key));
				}
			}
			httpEntity = new HttpEntity<>(paramLinkMap,headers);
			iamResult = restTemplate.exchange(url,HttpMethod.POST,httpEntity,JSONObject.class) ;
		}
		JSONObject jsonResult = iamResult.getBody();
		@SuppressWarnings("unchecked")
		JsonResult<T> result = JSONObject.parseObject(jsonResult.toJSONString(), JsonResult.class) ;
		return result ;
		
	}

	
}

  

package com.infosec.ztpdp.policycenter.component.httpclient;

import org.springframework.web.client.RestTemplate;

/**
 * <p> 
 *   调用Http接口工具类
 *   使用的为RestTemplate。
 * </p>
 *
 * <p>
*    版权所有:北京信安世纪科技股份有限公司 (c) 2019
 * </p>
 *
 * @author Tianzy
 *
 * 2020年9月10日 上午11:30:24
 *
 */
public class HttpClientUtils {
	
	/** http */
	public static RestTemplate httpRestTemplate ;
	
	/**
	 * <p>
	 *  Description: 获取Http接口调用 客户端
	 * </p>
	 * @return
	 *  	
	 * @author  Tianzy
	 *
	 * 2020年9月15日  下午6:01:55
	 *
	 */
	public static RestTemplate gethTttpRestTemplate() {
		return httpRestTemplate ;
	}
}

  

posted @ 2023-09-14 17:07  JLCUI  阅读(20)  评论(0编辑  收藏  举报