RestTemplate的设置及使用

摘要:
OverviewRestTemplate是spring内置的http请求封装。当使用spring时,直接对http请求使用RestTemplate是一个不错的选择。当Rest服务器使用RestTemplate启动http请求时,Rest服务提供者没有特殊要求。它可以根据传统的Spring MVC Controller层实现方法直接实现。˃˃converterList=restTemplate。getMessageConverters();//将StringHttpMessageConverter字符集重置为UTF-8,以解决中文乱码问题(converterTarget){converterList.remove;}converterList。添加;//添加FastJson转换器转换器列表添加;returnrestTemplate;}}StringHttpMessageConverter默认使用的字符集是ISO-8859-1。遇到中文时,会出现乱码。因此,需要删除RestTemplate默认StringHttpMessageConverter来修改字符集并重置它。

概述

RestTemplate是spring内置的http请求封装,在使用spring的情况下,http请求直接使用RestTemplate是不错的选择。

Rest服务端

使用RestTemplate发起http请求的时候,Rest服务提供者没有什么特殊要求,直接按照传统的SpringMVC的Controller层实现方式实现即可。

举例:

@RestController
@RequestMapping("/user")
public class UserController {

  private Logger logger = LoggerFactory.getLogger(UserController.class);

  @RequestMapping("/add")
  public UserBean add(UserBean userBean) {
    logger.info("request param:{}", JSON.toJSON(userBean));
    return userBean;
  }

}

Rest客户端

使用RestTemplate前先得做一些初始化处理,比如指定http客户端工厂类、设置超时时间、响应参数转换器等。

初始化RestTemplate

@Configuration
@ConditionalOnClass(value = {RestTemplate.class, HttpClient.class})
public class RestTemplateConfiguration {

  @Value("${remote.maxTotalConnect:0}")
  private int maxTotalConnect; //连接池的最大连接数默认为0
  @Value("${remote.maxConnectPerRoute:200}")
  private int maxConnectPerRoute; //单个主机的最大连接数
  @Value("${remote.connectTimeout:2000}")
  private int connectTimeout; //连接超时默认2s
  @Value("${remote.readTimeout:30000}")
  private int readTimeout; //读取超时默认30s

  //创建HTTP客户端工厂
  private ClientHttpRequestFactory createFactory() {
    if (this.maxTotalConnect <= 0) {
      SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
      factory.setConnectTimeout(this.connectTimeout);
      factory.setReadTimeout(this.readTimeout);
      return factory;
    }
    HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect)
        .setMaxConnPerRoute(this.maxConnectPerRoute).build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
        httpClient);
    factory.setConnectTimeout(this.connectTimeout);
    factory.setReadTimeout(this.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转换器
    converterList.add(new FastJsonHttpMessageConverter4());
    return restTemplate;
  }

}

StringHttpMessageConverter默认使用的字符集是ISO-8859-1,在遇到中文的时候会有乱码,所以需要移除RestTemplate默认的StringHttpMessageConverter修改字符字符集后重新设置。

   spring的json转换器默认使用的是Jackson,json字符串和对应的Entity如果有字段对不上就会报错,这个有点不符合国情,而FastJson则不会报错,所以很多时候都会用FastJSON替换默认的Jackson。

FastJSON替换Jackson配置

@Configuration
public class FastjsonConfiguration {


  @Bean
  public HttpMessageConverters fastjsonConverter() {
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    //自定义格式化输出
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
        SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullNumberAsZero);

    FastJsonHttpMessageConverter4 fastjson = new FastJsonHttpMessageConverter4();
    fastjson.setFastJsonConfig(fastJsonConfig);
    return new HttpMessageConverters(fastjson);
  }

}

RestTemplate使用举例

MultiValueMap传参

  @Test
  public void multiValueMapParam() {
    MultiValueMap<String, String> requestParam = new LinkedMultiValueMap<>();
    requestParam.set("name", "张三");
    UserBean result = restTemplate
        .postForObject("http://127.0.0.1:8280/user/add", requestParam, UserBean.class);
    logger.info("result:{}", JSON.toJSON(result));
  }

Entity传参

  @Test
  public void restClient() {
    UserBean userBean = new UserBean();
    userBean.setName("王五");
    String result = restTemplate
        .postForObject("http://127.0.0.1:8280/user/add", userBean, String.class);
    logger.info("result:{}", result);
  }

以Entity传参,接收端Controller以Entity接收参数的时候需加上@RequestBody注解,否则接收不到参数。

@RequestMapping("/add")
public UserBean add(@RequestBody UserBean userBean) {
    logger.info("request param:{}", JSON.toJSON(userBean));
    return userBean;
}

原文地址:http://www.itclj.com/blog/5925894681c06e672f942ad6

demo地址:https://github.com/clj198606061111/spring-boot-rest-template-demo

免责声明:文章转载自《RestTemplate的设置及使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity3d 创建线程 子线程与主线程通信selenium 常见问题整理。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RestTemplate 发送 get 请求使用误区 多个参数传值为null

RestTemplate 发送 get 请求使用误区 多个参数传值为null(转载) 首先看一下官方文档是怎么描述的,传递多个值的情况(注意例子中用到的@pathParam,一般要用@queryParam) RestTemplate 实例 @Configuration public class RestConfiguration { @...

fastjson SerializerFeature详解

依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</...

RestTemplate请求使用方法

获取restTemplate对象 封装请求头 封装请求参数 发起请求 获取返回值 获取restTemplate对象 1 RestTemplate restTemplate=new RestTemplate(); 封装请求头 HttpHeaders requestHeaders = newHttpHeaders(); //添加session List&...

【SpringCloud】Spring Cloud Sleuth + Zipkin 服务调用链路追踪(二十五)

服务调用链路追踪 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的...

Spring中RestTemplate的使用方法

一、REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增、删、改、查;名词,就是网络中的各种资源。传统的非REST风格的请求方式是把动词和名词全都放在url中。例如,对设备的操作可能是这样的:添加设备:http://test/device/add删除设备:http://test/device/d...

RestTemplate 发送Post 多个参数请求

        MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>(); requestEntity.add("clientFlag", clientFlag); requ...