iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用spring的restTemplate注意点有哪些
  • 812
分享到

使用spring的restTemplate注意点有哪些

2023-06-25 11:06:25 812人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关使用spring的restTemplate注意点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用spring的restTemplate注意点spring的restTem

这篇文章将为大家详细讲解有关使用spring的restTemplate注意点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

使用spring的restTemplate注意点

spring的restTemplate可以向一个url发送请求并接收服务器端的响应信息。但在发请求时,会对请求的url值进行编码再发送。

下面看spring的RestTemplate的源码

restTemplate基本上发送请求的方法内部都会调用到execute()方法:

使用spring的restTemplate注意点有哪些

expand()方法的代码如下:

使用spring的restTemplate注意点有哪些

encode()方法的代码如下:

使用spring的restTemplate注意点有哪些

所以如果使用非spring的服务器接收时,需要进行解码才能接收到RestTemplate发送的内容。(spring的服务器接收到参数时会自动进行一次解码,所以使用restTemplate发送消息,Spring的服务器接收时不会出现问题)。

spring的RestTemplate使用指南

前言:现在restful接口越来越广泛,而如今很多接口摒弃了传统的配置复杂的WEBService开发模式,在java领域只需要很简单的springMVC就可以声明为一个控制器,再加上service层,就可以直接操作数据库成为一个灵活的接口。

而我们请求接口的次数也会越来越多(最近我在和一个工具对接的时候,对方公司提供的接口全部由我们主动去调用),一般我们请求接口,都采用Apache Httpclient工具,这个工具稳定,既可以建立长连接,保持不错的性能,而它唯一的不足就是使用起来麻烦多变,并且要很多层判断处理,今天我要谈的就是spring对httpClient的再封装工具类,restTemplate,采用模板模式抽象出来的高效工具。

有点类似于jdbcTemplate,今天我们就来一步步揭开它的使用方法

一:restTemplate简介

1.1:restTemplate的类结构

使用spring的restTemplate注意点有哪些

可以看出它继承自HttpAccessor这个统一的处理器,然后再继承自InterceptingHttpAccessor,这个拦截转换器,最终RestTemplate实现了封装httpClient的模板工具类

1.2:restTemplate的方法

Spring用于同步客户端HTTP访问的中心类。它简化了与HTTP服务器的通信,并执行RESTful原则。它处理HTTP连接,使应用程序代码提供URL,使用可能的模板变量,并提取结果。

注意:默认情况下,RestTemplate依赖于标准的jdk来建立HTTP连接。你可以切换使用不同的HTTP库,如Apache HttpComponents,Netty和OkHttp通过setRequestFactory属性。内部模板使用HttpMessageConverter实例将HTTP消息转换为POJO和从POJO转换。主要MIME类型的转换器是默认注册的,但您也可以注册其他转换器通过setMessageConverters

以下是http方法和restTempalte方法的比对映射,可以看出restTemplate提供了操作http的方法,其中exchange方法可以用来做任何的请求,一般我们都是用它来封装不同的请求方式。

使用spring的restTemplate注意点有哪些

二:restTemplate的配置方法

2.1:在springboot中的配置

SpringBoot是一款简化传统xml配置式的开发方式,主要采用注解的方式来代替传统繁琐的xml配置,接下来我们就用springboot提供的注解来配置restTemplate:

@Configurationpublic class RestTemplateConfig {    private static final Logger logger= LoggerFactory.getLogger(RestTemplateConfig.class);    @Bean    public RestTemplate restTemplate() {        // 添加内容转换器,使用默认的内容转换器        RestTemplate restTemplate = new RestTemplate(httpRequestFactory());        // 设置编码格式为UTF-8        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();        HttpMessageConverter<?> converterTarget = null;        for (HttpMessageConverter<?> item : converterList) {            if (item.getClass() == StringHttpMessageConverter.class) {                converterTarget = item;                break;            }        }        if (converterTarget != null) {            converterList.remove(converterTarget);        }        HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);        converterList.add(1,converter);        LOGGER.info("-----restTemplate-----初始化完成");        return restTemplate;    }    @Bean    public ClientHttpRequestFactory httpRequestFactory() {        return new HttpComponentsClientHttpRequestFactory(httpClient());    }    @Bean    public HttpClient httpClient() {        // 长连接保持30秒        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);        //设置整个连接池最大连接数 根据自己的场景决定        connectionManager.setMaxTotal(500);        //同路由的并发数,路由是对maxTotal的细分        connectionManager.setDefaultMaxPerRoute(500);        //requestConfig        RequestConfig requestConfig = RequestConfig.custom()                //服务器返回数据(response)的时间,超过该时间抛出read timeout                .setSocketTimeout(10000)                //连接上服务器(握手成功)的时间,超出该时间抛出connect timeout                .setConnectTimeout(5000)                //从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool                .setConnectionRequestTimeout(500)                .build();        //headers        List<Header> headers = new ArrayList<>();        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (windows NT 6.1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));        headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));        headers.add(new BasicHeader("Accept-Language", "zh-CN"));        headers.add(new BasicHeader("Connection", "Keep-Alive"));        headers.add(new BasicHeader("Content-type", "application/JSON;charset=UTF-8"));        return HttpClientBuilder.create()                .setDefaultRequestConfig(requestConfig)                .setConnectionManager(connectionManager)                .setDefaultHeaders(headers)                // 保持长连接配置,需要在头添加Keep-Alive                .seTKEepAliveStrategy(new DefaultConnectionKeepAliveStrategy())                //重试次数,默认是3次,没有开启                .setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))                .build();    }}

首先解释以下@configuration,它的主要作用就是在spring容器启动的时候,初始化ioc,使用了这个注解,那么该类就会在spring启动的时候,把@Bean注解标识的类进行依赖注入。@Bean理解的话,就好比在配置文件中配置<bean>.接下来就是在restTemplate的构造方法中添加httpRequest的工厂,使用连接池来优化http通信,默认使用长连接时间为30秒,再设置路由让http连接定向到指定的IP,然后设置并发数。再就是设置请求配置的超时时间,为了防止请求时间过长而引起资源的过渡浪费。如果在超过设置的timeout还没有数据返回,就直接断开连接。headers是添加默认的请求头,这里设置了传送的格式为json,语言为中-英等等属性。HttpClientBuilder.create设置请求头到HttpClient,然后在设置保持的时间,重试的次数,注入给httpClient进行封装。

在bean中的HttpMessageConverter,就是http信息转换器,它的主要作用就是转换和解析返回来的json数据,restTemplate默认使用jackson来作为底层的解析工具,而其它的比如Gson,fastjson等等第三方开源库放在headers这个list中,如果要使用,可以通过以下代码进行改变:

 this.restTemplate.getMessageConverters().clear();        final List<HttpMessageConverter<?>> myHttpMessageConverter = new ArrayList<HttpMessageConverter<?>>();                 //自己实现的messgeConverter        HttpMessageConverter<Object> messageConverter = new MyHttpMessageConverter<Object>();                myHttpMessageConverter.add(messageConverter);                this.restTemplate.setMessageConverters(myHttpMessageConverter);

三:restUtil工具类

restUtil就是通过包装restTemplate暴露出面向外界的方法,通过高度封装,可以隐藏内部细节,简单使用,在使用它的时候,我们只需要传入请求的url和对应的参数,然后就可以取到结果了。参数一般有两种形式,一种是直接传入json,另一种是key、value形式的,key/value形式的,可以直接使用execute方法,传入url和请求的方法类型就可以了。在开头看到了restTemplate基本上是支持所有http请求的,接下来的工具类就介绍一下post和get请求的主要封装方法

@Componentpublic class RestUtil {    @Autowired    private  RestTemplate restTemplate;    //一些自定义的请求头参数    public static final String supplierID="";    public static final String interfacekey= "";        public String execute(Map<String,Object> param, String url, HttpMethod method){        HttpHeaders headers = this.getDefaultHeader();        Map<String,Object> requestor = this.getDefaultParam();        param.put("requestor",requestor);        param.put("supplierID",supplierID);        HttpEntity<Map<String,Object>> requestEntity = new HttpEntity<>(param, headers);        ResponseEntity<String> response = restTemplate.exchange(url,method, requestEntity, String.class);        return response.getBody();    }        public HttpHeaders getDefaultHeader(){        String timestamp = ""+System.currentTimeMillis();        String signature = EncoderByMd5(supplierID + timestamp + interfacekey);        HttpHeaders headers = new HttpHeaders();        headers.add("signature", signature);        headers.add("timestamp", timestamp);        return headers;    }        public Map<String,Object> getDefaultParam(){        Map<String,Object> defParam = new HashMap<>();        defParam.put("invoker","xx");        defParam.put("operatorName","xx");        return defParam;    }        public static String EncoderByMd5(String str){        if (str == null) {            return null;        }        try {            // 确定计算方法            MessageDigest md5 = MessageDigest.getInstance("MD5");            BASE64Encoder base64en = new BASE64Encoder();            // 加密后的字符串            return base64en.encode(md5.digest(str.getBytes("utf-8"))).toUpperCase();        } catch (NoSuchAlGorithmException | UnsupportedEncodingException e) {            return null;        }    }           public String restGet(String url,String jsonData){        return request(url, jsonData,HttpMethod.GET);    }        private String request(String url, String jsonData,HttpMethod httpMethod) {        ResponseEntity<String> response=null;        try {            if (Check.isEmpty(url)) {                throw new IllegalArgumentException();            }            HttpEntity<String> requestEntity = new HttpEntity<String>(jsonData);            response = restTemplate.exchange(url, httpMethod, requestEntity, String.class);        }catch (Exception ex){            ex.printStackTrace();            return "";        }        return response.getBody().toString();    }        public <T> T getForEntity(String url,Class<T> responseType,Object... parms){        return (T) restTemplate.getForEntity(url,responseType,parms);    }      public String get(String url,Map<String,Object> parm){    return restTemplate.getForEntity(url,String.class,parm).getBody(); }}

四:使用示例

4.1:首先我们用springBoot来搭建一个简单的rest请求链接

我们来模拟一个请求,传入年龄和性别、身高,计算出标准体重的接口,这段代码比较简单,我只给出示范代码:

@SpringBootApplication@RestControllerpublic class HealApplication {    @RequestMapping(value = "weight", method = RequestMethod.GET)    public ResultModel getWeight(@RequestParam(value = "height", required = false) Integer height,   @RequestParam(value = "sex", required = false) Integer sex, @RequestParam(value = "age", required = false) Integer age) {        if (height == null || age == null || sex == null || (!sex.equals(0) && !sex.equals(1))) {            return new ResultModel(400, "缺少请求参数或者参数错误", 0d);        }        double condition = getStandardWeight(sex, age, height);        return new ResultModel(200, "请求成功", condition);    }        public double getStandardWeight(int sex, int age, int height) {        double weight = 0.0;        switch (sex) {            //男性            case 1:                if (age < 12 && age > 2) {                    weight = age * 2 + 12;                } else if (age > 12) {                    weight = (height - 150) * 0.6 + 50;                }                break;            case 0:                if (age < 12 && age > 2) {                    weight = age * 2 + 12;                } else if (age > 12) {                    weight = (height - 100) * 0.6 + 50;                }                break;            default:                weight = 0;                break;        }        return weight;    }

可以看到我们的控制器有个映射weight请求的方法,通过传入年龄、身高、性别,就可以计算出标准体重,我们来启动springBoot,先试着用浏览器访问一下,可以看出如下结果:

使用spring的restTemplate注意点有哪些

使用spring的restTemplate注意点有哪些

4.2:为了表明接口是通的,我们再用postman来试一下,可以看到返回结果正确:

使用spring的restTemplate注意点有哪些

4.3:在springboot里引入testNg单元测试类,测试一下访问这个链接的结果:

public class TestRestManager  extends OrderProviderApplicationTests {    @Autowired    private RestUtil restUtil;        @Test    private void  requestGet(){        String url="http://localhost:8080/weight?age={age}&sex={sex}&height={height}";        //组装请求参数        Map<String,Object> parmMap =new HashMap<String,Object>();        parmMap.put("age",35);        parmMap.put("sex",1);        parmMap.put("height",178);        String result = restUtil.get(url, parmMap);        System.out.println(result);    }}

结果返回以下内容:

使用spring的restTemplate注意点有哪些

关于“使用spring的restTemplate注意点有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 使用spring的restTemplate注意点有哪些

本文链接: https://www.lsjlt.com/news/304223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用spring的restTemplate注意点有哪些
    这篇文章将为大家详细讲解有关使用spring的restTemplate注意点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用spring的restTemplate注意点spring的restTem...
    99+
    2023-06-25
  • 使用spring的restTemplate注意点
    目录使用spring的restTemplate注意点下面看spring的RestTemplate的源码spring的RestTemplate使用指南一:restTemplate简介二...
    99+
    2022-11-12
  • Spring使用RestTemplate和Junit单元测试的注意事项有哪些
    小编给大家分享一下Spring使用RestTemplate和Junit单元测试的注意事项有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用RestTemplate和Junit单元测试的注意事项对于之前写单元测试注入的...
    99+
    2023-06-25
  • canvas使用注意点有哪些
    这篇文章将为大家详细讲解有关canvas使用注意点有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、canvas中文教程https://develop...
    99+
    2022-10-19
  • Python Spring缓存同步有哪些注意点?
    在使用Python和Spring框架进行开发时,缓存是一个非常重要的概念。缓存可以大大提高应用程序的性能和响应速度。但是,在使用缓存时,需要注意一些问题,以确保缓存的正确性和一致性。在本文中,我们将探讨Python Spring缓存同步的...
    99+
    2023-06-07
    spring 同步 缓存
  • Spring使用RestTemplate和Junit单元测试的注意事项
    目录使用RestTemplate和Junit单元测试的注意事项springboot中的单元测试MockMVC和TestRestTemplate的使用与对比MockMVCRestTem...
    99+
    2022-11-12
  • Servlet的init注意点有哪些
    本篇内容主要讲解“Servlet的init注意点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Servlet的init注意点有哪些”吧!在Servlet的GenericServleta类中...
    99+
    2023-06-04
  • spring事务的注意事项有哪些
    spring事务的注意事项有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  事务一般是指数据库事务,是指作为一个程序执行单元执行的一...
    99+
    2022-10-19
  • 使用Redis时必须注意的要点有哪些
    小编给大家分享一下使用Redis时必须注意的要点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、Redis的使用规范1....
    99+
    2022-10-18
  • react中JSX的注意点有哪些
    今天小编给大家分享一下react中JSX的注意点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 JSX 是一个表达式...
    99+
    2023-06-29
  • 使用Visual Studio 2010 RC注意要点有哪些
    这篇文章给大家分享的是有关使用Visual Studio 2010 RC注意要点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用Visual Studio 2010 RC版本时,发现了一个小问题,需要引...
    99+
    2023-06-17
  • python参数调用的注意点有哪些
    这篇文章给大家分享的是有关python参数调用的注意点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、数量定义时必须一致这个大家都比较好理解,定义和调用时参数数量不一样肯定会报错,但是,不要小看这个错误,...
    99+
    2023-06-15
  • python调用函数的注意点有哪些
    今天小编给大家分享一下python调用函数的注意点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、当函数有多个参数时...
    99+
    2023-06-30
  • 写jQuery插件时的注意点有哪些
    这篇文章主要为大家展示了“写jQuery插件时的注意点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“写jQuery插件时的注意点有哪些”这篇文章吧。支持U...
    99+
    2022-10-19
  • python创建模块的注意点有哪些
    这篇文章给大家分享的是有关python创建模块的注意点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明模块名称应遵循Python变量命名规范,不得使用中文或特殊字符;不要与系统模块名冲突,最好先检查系统是...
    99+
    2023-06-20
  • HTTP代理的挑选注意点有哪些
    这篇文章将为大家详细讲解有关HTTP代理的挑选注意点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、观察IP资源是否多,看看商家提供的IP数量。若IP数量较少,一是不适合大用量的业务操作,二是影响...
    99+
    2023-06-15
  • SQL语句编写注意点有哪些
    这篇文章给大家分享的是有关SQL语句编写注意点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、使用英文模式下的 “`” 注意此处不是单引号  正确格式: &nb...
    99+
    2022-10-19
  • html和css基础注意点有哪些
    html和css基础注意点有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1      减少无意义标签的使用 简单的举个例...
    99+
    2023-06-08
  • 在IE中使用HTML5功能需要注意的点有哪些
    在IE中使用HTML5功能需要注意的点有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。HTML5草案的前身名为Web Ap...
    99+
    2022-10-19
  • jQuery.post使用的注意事项有哪些
    本篇内容介绍了“jQuery.post使用的注意事项有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作