37 SpringBoot与HttpClient整合

版权声明:看什么?6,你和我,走一波! https://blog.csdn.net/qq_31323797/article/details/86524717

1 RestTemplateConfig

package com.gp6.springboot32.config;

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * RestTemplate配置
 *
 * @author gp6
 * @date 2019-01-16
 */
@Configuration
public class RestTemplateConfig {
    @Value("${rest.readTimeOut}")
    private Integer readTimeOut;

    @Value("${rest.connectTimeOut}")
    private Integer connectTimeOut;

    @Value("${rest.maxConnectPerRoute}")
    private Integer maxConnectPerRoute;

    @Value("${rest.maxTotalConnect}")
    private Integer maxTotalConnect;

    // 创建HTTP客户端工厂
    @Bean
    public ClientHttpRequestFactory createFactory() {
        if (maxTotalConnect <= 0) {
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setConnectTimeout(connectTimeOut);
            factory.setReadTimeout(readTimeOut);
            return factory;
        }

        HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect)
                .setMaxConnPerRoute(this.maxConnectPerRoute).build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
                httpClient);
        factory.setConnectTimeout(connectTimeOut);
        factory.setReadTimeout(readTimeOut);
        return factory;
    }

    // 初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理
    @Bean
    @ConditionalOnMissingBean(RestTemplate.class)
    public RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate(this.createFactory());
        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();

        // 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题
        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(StandardCharsets.UTF_8));

        //加入FastJson转换器 根据使用情况进行操作,此段注释,默认使用jackson
        //converterList.add(new FastJsonHttpMessageConverter4());
        return restTemplate;
    }
}

2 RestTemplateService

package com.gp6.springboot32.service;

import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.client.RestClientException;

import java.net.URI;
import java.util.Map;

/**
 * RestTemplate接口
 *
 * @author gp6
 * @date 2019-01-16
 */
public interface RestTemplateService {

    /**
     * GET----获取对象
     *
     * @param uri 请求uri
     * @param t   返回值的类型
     * @param <T> 泛型
     * @return 获取的对象
     */
    <T> T getForObject(URI uri, Class<T> t);

    /**
     * GET----获取数组
     *
     * @param url     请求url
     * @param responseType       返回值的类型
     * @param <T>     泛型
     * @param uriVariables 参数数组
     * @return 获取的对象
     */
    <T> T getForObject(String url, Class<T> responseType, Object... uriVariables);

    /**
     * GET----请求带有参数
     */
    <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables);

    <T> ResponseEntity<T> getForEntity(URI uri, Class<T> responseType);

    <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables);

    <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables);


    // POST
    <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;

    <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

    <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;

    <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;

    <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

    <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;

    // PUT
    void put(String url, @Nullable Object request, Object... uriVariables);

    void put(String url, @Nullable Object request, Map<String, ?> uriVariables);

    void put(URI url, @Nullable Object request) throws RestClientException;

    // DELETE
    void delete(String url, Object... uriVariables) throws RestClientException;

    void delete(String url, Map<String, ?> uriVariables) throws RestClientException;

    void delete(URI url) throws RestClientException;

}

3 RestTemplateServiceImpl

package com.gp6.springboot32.service.impl;

import com.gp6.springboot32.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.Map;

/**
 * RestTemplate实现类
 *
 * @author gp6
 * @date 2019-01-16
 */
@Service
public class RestTemplateServiceImpl implements RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public <T> T getForObject(URI uri, Class<T> t) {
        return restTemplate.getForObject(uri, t);
    }

    @Override
    public <T> T getForObject(String url, Class<T> t, Object... object) {
        return restTemplate.getForObject(url, t, object);
    }

    @Override
    public <T> T getForObject(String url, Class<T> t, Map<String, ?> map) {
        return restTemplate.getForObject(url, t, map);
    }

    @Override
    public <T> ResponseEntity<T> getForEntity(URI uri, Class<T> t) {
        return restTemplate.getForEntity(uri, t);
    }

    @Override
    public <T> ResponseEntity<T> getForEntity(String url, Class<T> t, Object... object) {
        return restTemplate.getForEntity(url, t, object);
    }

    @Override
    public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) {
        return restTemplate.getForEntity(url, responseType, uriVariables);
    }

    @Override
    @Nullable
    public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        return restTemplate.postForObject(url, request, responseType, uriVariables);
    }

    @Override
    @Nullable
    public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        return restTemplate.postForObject(url, request, responseType, uriVariables);
    }

    @Override
    @Nullable
    public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {
        return restTemplate.postForObject(url, request, responseType);
    }

    @Override
    public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
        return restTemplate.postForEntity(url, request, responseType, uriVariables);
    }

    @Override
    public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
        return restTemplate.postForEntity(url, request, responseType, uriVariables);
    }

    @Override
    public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {
        return restTemplate.postForEntity(url, request, responseType);
    }

    // PUT
    @Override
    public void put(String url, @Nullable Object request, Object... uriVariables)
            throws RestClientException {
        restTemplate.put(url, request, uriVariables);
    }

    @Override
    public void put(String url, @Nullable Object request, Map<String, ?> uriVariables)
            throws RestClientException {

        restTemplate.put(url, request, uriVariables);
    }

    @Override
    public void put(URI url, @Nullable Object request) throws RestClientException {
        restTemplate.put(url, request);
    }

    // DELETE
    @Override
    public void delete(String url, Object... uriVariables) throws RestClientException {
        restTemplate.delete(url, uriVariables);
    }

    @Override
    public void delete(String url, Map<String, ?> uriVariables) throws RestClientException {
        restTemplate.delete(url, uriVariables);
    }

    @Override
    public void delete(URI url) throws RestClientException {
        restTemplate.delete(url);
    }
}

4 配置文件

# RestTemplate
rest:
  # 读取超时时间 单位:毫秒
  readTimeOut: 3000

  # 连接超时时间
  connectTimeOut: 2000

  # 单个主机的最大连接数
  maxConnectPerRoute: 20

  # 连接池的最大连接池
  maxTotalConnect: 0

5 测试

package com.gp6.springboot32.controller;

import com.gp6.springboot32.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.net.URI;
import java.net.URISyntaxException;

@Controller
@RequestMapping({"test"})
public class HelloController {

    @Autowired
    private RestTemplateService restTemplateService;

    @GetMapping(value = "{id}")
    public void selectFbaOutApplyById(@PathVariable("id") Integer id) throws URISyntaxException {
        URI uri = new URI("http://192.168.8.36:8081/rest/item/cat?id=2");
        ResponseEntity<String> a = restTemplateService.getForEntity(uri, String.class);
        System.out.println(a);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31323797/article/details/86524717
37