ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot教程(二)——集成RestTemplate

2021-03-14 11:01:27  阅读:225  来源: 互联网

标签:responseType 教程 return SpringBoot uriVariables url RestTemplate param paramMap


1.yml配置:

http:
    pool:
      maxTotal: 500
      defaultMaxPerRoute: 300
      connectTimeout: 10000
      connectionRequestTimeout: 500
      socketTimeout: 15000
      validateAfterInactivity: 30000

2.HTTP配置类:

/**
 * 说明:
 * Http连接池属性。
 *
 * @author zlx
 * @create: 2021-03-14
 */
@Data
public class HttpPoolProperties {
 
    private Integer maxTotal;
    private Integer defaultMaxPerRoute;
    private Integer connectTimeout;
    private Integer connectionRequestTimeout;
    private Integer socketTimeout;
    private Integer validateAfterInactivity;
 
/**
 * 说明:
 * 抽象的http client。
 *
 * @author zlx
 * @create: 2021-03-14
 *
 */
public class AbstractHttpClientConfig {
 
    /**
     * 说明:
     * 构建一个基于连接池的apache http client;
     *
     * @param httpPoolProperties
     * @return
     */
    public HttpClient buildHttpClient(HttpPoolProperties httpPoolProperties) {
 
        // 1.
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
 
        // 2. http池properties:
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        connectionManager.setMaxTotal(httpPoolProperties.getMaxTotal());
        connectionManager.setDefaultMaxPerRoute(httpPoolProperties.getDefaultMaxPerRoute());
        connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());
 
        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(httpPoolProperties.getSocketTimeout())
                .setConnectTimeout(httpPoolProperties.getConnectTimeout())
                .setConnectionRequestTimeout(httpPoolProperties.getConnectionRequestTimeout())
                .build();
 
        return HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();
    }
 
 
    /**
     * 说明:
     * 构建RestTemplate,并设置默认的字符集;
     *
     * @param clientHttpRequestFactory
     * @return
     */
    public RestTemplate buildRestTemplate(ClientHttpRequestFactory clientHttpRequestFactory, Charset charset) {
        // 1. + httpClient pool:
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
 
        // 2. msg handler:
        this.messageConverterHandler(restTemplate, charset);
 
        return restTemplate;
    }
 
    /** 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题 */
    public void messageConverterHandler(RestTemplate restTemplate, Charset charset) {
        // 1. 消息转化器,字符集处理:
        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
 
        // 2. 重置:
        HttpMessageConverter<?> converterTarget = null;
        for (HttpMessageConverter<?> item : converterList) {
            if (StringHttpMessageConverter.class == item.getClass()) {
                converterTarget = item;
                break;
            }
        }
        if (null != converterTarget) {
            converterList.remove(converterTarget);
        }
        converterList.add(1, new StringHttpMessageConverter(charset));
    }
 
}
/**
 * 说明:
 * Http客户端注册。
 * <p>
 * 基于Apache Http client的RestTemplate 
 *
 * @author zlx
 * @create: 2021-03-14
 */
@Configuration
public class HttpClientConfig extends AbstractHttpClientConfig {
 
    @Bean(name = "poolProperties")
    @ConfigurationProperties(prefix = "http.pool")
    public HttpPoolProperties poolProperties() {
        return new HttpPoolProperties();
    }
 
    @Bean(value = "httpClient")
    public HttpClient httpClient(@Qualifier("poolProperties") HttpPoolProperties httpPoolProperties) {
 
        return this.buildHttpClient(httpPoolProperties);
    }
 
    @Bean(name = "httpRequestFactory")
    public ClientHttpRequestFactory httpRequestFactory(@Qualifier("httpClient") HttpClient httpClient) {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        httpRequestFactory.setConnectionRequestTimeout(10000);
        httpRequestFactory.setConnectTimeout(10000);
        httpRequestFactory.setReadTimeout(10000);
        return httpRequestFactory;
    }
 
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate(@Qualifier("httpRequestFactory") ClientHttpRequestFactory clientHttpRequestFactory) {
        RestTemplate restTemplate = this.buildRestTemplate(clientHttpRequestFactory, StandardCharsets.UTF_8);
        return restTemplate;
    }
 
}

3.HTTP工具类:

/**
 * @author zlx
 * @create: 2021-03-14
 */
@Component
@Slf4j
public class HttpClientUtil {
 
    @Qualifier("restTemplate")
    @Autowired
    private RestTemplate httpRestTemplate;
 
    /**
     * get请求
     *
     * @param url          地址
     * @param uriVariables URI参数
     * @return
     */
    public String doGet(@NotNull String url,
                        Map<String, String> paramMap,
                        Object... uriVariables) {
        return doGet(url, paramMap, String.class, null, uriVariables);
    }
 
    /**
     * 不需要Header GET请求
     *
     * @param url          地址
     * @param paramMap     参数
     * @param responseType response类型
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doGet(@NotNull String url,
                       Map<String, String> paramMap,
                       @NotNull Class<T> responseType,
                       Object... uriVariables) {
        return doGet(url, paramMap, responseType, null, uriVariables);
    }
 
    /**
     * GET请求
     *
     * @param url          地址
     * @param paramMap     参数
     * @param responseType response类型
     * @param headerMap    Header
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doGet(@NotNull String url,
                       Map<String, String> paramMap,
                       @NotNull Class<T> responseType,
                       Map<String, String> headerMap,
                       Object... uriVariables) {
        return doMethod(url, null, paramMap, responseType, headerMap, HttpMethod.GET, uriVariables);
    }
 
    /**
     * 不需要Header POST
     *
     * @param url          地址
     * @param object       BODY
     * @param responseType response类型
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doPost(@NotNull String url,
                        Object object,
                        Map<String, String> paramMap,
                        @NotNull Class<T> responseType,
                        Object... uriVariables) {
 
        return doPost(url, object, paramMap, responseType, null, uriVariables);
    }
 
    /**
     * POST
     *
     * @param url          地址
     * @param object       BODY
     * @param paramMap Parameters
     * @param responseType response类型
     * @param headerMap    Header
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doPost(@NotNull String url,
                        Object object,
                        Map<String, String> paramMap,
                        @NotNull Class<T> responseType,
                        Map<String, String> headerMap,
                        Object... uriVariables) {
 
        return doMethod(url, object, paramMap, responseType, headerMap, HttpMethod.POST, uriVariables);
    }
 
    /**
     * 不需要Header PUT请求
     *
     * @param url          地址
     * @param object       BODY
     * @param paramMap Parameters
     * @param responseType response类型
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doPut(@NotNull String url,
                       Object object,
                       Map<String, String> paramMap,
                       @NotNull Class<T> responseType,
                       Object... uriVariables) {
 
        return doPut(url, object, paramMap, responseType, null, uriVariables);
 
    }
 
    /**
     * PUT请求
     *
     * @param url          地址
     * @param object       BODY
     * @param paramMap Parameters
     * @param responseType response类型
     * @param headerMap    Header
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doPut(@NotNull String url,
                       Object object,
                       Map<String, String> paramMap,
                       @NotNull Class<T> responseType,
                       Map<String, String> headerMap,
                       Object... uriVariables) {
        return doMethod(url, object, paramMap, responseType, headerMap, HttpMethod.PUT, uriVariables);
    }
 
    /**
     * DELETE 请求
     *
     * @param url
     * @param responseType response类型
     * @param paramMap Parameters
     * @param headerMap    Header
     * @param uriVariables URI参数
     * @param <T>
     * @return
     */
    public <T> T doDelete(@NotNull String url,
                          @NotNull Class<T> responseType,
                          Map<String, String> paramMap,
                          Map<String, String> headerMap,
                          Object... uriVariables) {
        return doMethod(url, null, paramMap,  responseType, headerMap, HttpMethod.DELETE, uriVariables);
    }
 
    /**
     * @param url          地址
     * @param object       BODY
     * @param responseType response类型
     * @param headerMap    Header
     * @param method       Http方法
     * @param uriVariables URI参数
     * @param <T>          responseType实体
     * @return
     */
    public <T> T doMethod(@NotNull String url,
                          Object object,
                          Map<String, ?> paramMap,
                          @NotNull Class<T> responseType,
                          Map<String, String> headerMap,
                          HttpMethod method,
                          Object... uriVariables) {
 
        HttpEntity httpEntity = this.createHttpEntity(object, headerMap);
 
        // 出现异常打印响应body处理
        httpRestTemplate.setErrorHandler(new RestResponseErrorHandler());
        url = getUrlParamsByMap(url, paramMap);
        // 发出请求:
        ResponseEntity<T> responseEntity =
                httpRestTemplate.exchange(url, method, httpEntity, responseType, uriVariables);
        return this.getEntityFromHttpResponse(responseEntity);
    }
 
    /**
     * Map转url参数
     *
     * @param url
     * @param map
     * @return
     */
    private String getUrlParamsByMap(String url, Map<String, ?> map) {
        if (map == null || map.size() < 1) {
            return url;
        }
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(url);
        String wenHao = "?";
        String yuMark = "&";
        if (url.contains(wenHao)) {
            stringBuffer.append(yuMark);
        } else {
            stringBuffer.append(wenHao);
        }
        for (Map.Entry<String, ?> entry : map.entrySet()) {
            stringBuffer.append(entry.getKey() + "=" + entry.getValue());
            stringBuffer.append(yuMark);
        }
        String str = stringBuffer.toString();
        if (str.endsWith(yuMark)) {
            str = StringUtils.substringBeforeLast(str, yuMark);
        }
        return str;
    }
 
    /**
     * 说明:
     * 创建HTTP请求实体(header + entity)
     *
     * @param body
     * @param headerMap
     * @param <T>
     * @return
     */
    private <T> HttpEntity createHttpEntity(T body, Map<String, String> headerMap) {
        // 1. 生成Http Header:
        HttpHeaders headers = createHttpHeaders(headerMap);
        return new HttpEntity(body, headers);
    }
 
    /**
     * 创建 Header
     *
     * @param headerMap
     * @return
     */
    private HttpHeaders createHttpHeaders(Map<String, String> headerMap) {
        HttpHeaders headers = new HttpHeaders();
        if (null != headerMap) {
            headerMap.forEach((key, value) -> {
                headers.set(key, value);
            });
        }
        return headers;
    }
 
    /**
     * @param responseEntity
     * @param <T>
     * @return
     * @throws HttpException
     */
    private <T> T getEntityFromHttpResponse(ResponseEntity<T> responseEntity) {
        // 3.提取用户信息:
        if (responseEntity.getStatusCodeValue() != HttpStatus.OK.value()) {
            throw new HHSJException(responseEntity.getBody().toString());
        }
        return responseEntity.getBody();
    }
 
 
}

 

标签:responseType,教程,return,SpringBoot,uriVariables,url,RestTemplate,param,paramMap
来源: https://blog.csdn.net/weixin_43741092/article/details/114778916

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有