SpringBoot 如何使用RestTemplate来调用接口

目录
  • 使用RestTemplate来调用接口

    1.新建一个配置类,配置RestTemplate的Bean

    import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }

    注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory

    把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

    2.多种传输和接收参数的方式

    2.1postForObject方法

    postForObject指post请求,并返回一个Object对象。

    • 第1个参数:请求的url地址
    • 第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下

    new HttpEntity(请求体)

    new HttpEntity(请求头)

    new HttpEntity(请求体,请求头)

    • 第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
    • 第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)

    2.1.1使用Json来传递和接收数据

    首先引入fastJson的pom配置

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->		<dependency>			<groupId>com.alibaba</groupId>			<artifactId>fastjson</artifactId>			<version>1.2.49</version>		</dependency>

    在实现类中注入RestTemplate

    接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据

    public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}

    接收端

    用@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

    postForEntity

    和getForEntity原理是一样的,下面会讲到。

    2.2getForObject方法

    getForObject指get请求,并返回一个Object对象。这里有3种方法。

    • 第1个参数:请求的url地址
    • 第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
    • 第3个参数:参数值,这里有Map和 可变参数两种形式

    2.2.1

    通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}

    Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class,map);

    接口端:

    @RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}

    2.2.2 通过可变参数的方式

    也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样

    String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class, "hello", "world");

    2.3getForEntity方法

    getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:

    		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result

    RestTemplate调用接口总结

    • 1.新建一个配置类,配置RestTemplate的Bean
      import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }

      注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory

      把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

      2.多种传输和接收参数的方式

      2.1postForObject方法

      postForObject指post请求,并返回一个Object对象。

      • 第1个参数:请求的url地址
      • 第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下

      new HttpEntity(请求体)

      new HttpEntity(请求头)

      new HttpEntity(请求体,请求头)

      • 第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
      • 第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)

      2.1.1使用Json来传递和接收数据

      首先引入fastJson的pom配置

      <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->		<dependency>			<groupId>com.alibaba</groupId>			<artifactId>fastjson</artifactId>			<version>1.2.49</version>		</dependency>

      在实现类中注入RestTemplate

      接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据

      public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}

      接收端

      @RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

      postForEntity

      和getForEntity原理是一样的,下面会讲到。

      2.2getForObject方法

      getForObject指get请求,并返回一个Object对象。这里有3种方法。

      • 第1个参数:请求的url地址
      • 第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
      • 第3个参数:参数值,这里有Map和 可变参数两种形式

      2.2.1

      通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}

      Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class,map);

      接口端:

      @RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}

      2.2.2 通过可变参数的方式

      也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样

      String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class, "hello", "world");

      2.3getForEntity方法

      getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:

      		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result

      RestTemplate调用接口总结

      1.这是接口信息

          @PostMapping("/testm")    public ReturnResult show11(@RequestParam("id") String id,                               @RequestParam("name") String name) {        System.out.println(id);        UserInfo userInfo = userInfoMapper.selectByUserName(name);         return ReturnResult.create(userInfo);    }

      这是restTemplate调用

          //Post,@RequestParam---postForEntity    @Test    public void sho11() {        String url = "http://127.0.0.1:8099/user/testm";        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();        request.add("id", "12324");        request.add("name", "nanc");         ResponseEntity<ReturnResult> resp = restTemplate.postForEntity(url, request, ReturnResult.class);        ReturnResult body = resp.getBody();        UserInfo data = body.getData();        System.err.println(data.getUserId());        System.out.println(data);      }

      2.接口

使用RestTemplate来调用接口

1.新建一个配置类,配置RestTemplate的Bean

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.web.client.RestTemplate; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }

注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory

把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

2.多种传输和接收参数的方式

2.1postForObject方法

postForObject指post请求,并返回一个Object对象。

  • 第1个参数:请求的url地址
  • 第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下

new HttpEntity(请求体)

new HttpEntity(请求头)

new HttpEntity(请求体,请求头)

  • 第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
  • 第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)

2.1.1使用Json来传递和接收数据

首先引入fastJson的pom配置

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->		<dependency>			<groupId>com.alibaba</groupId>			<artifactId>fastjson</artifactId>			<version>1.2.49</version>		</dependency>

在实现类中注入RestTemplate

接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据

public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}

接收端

@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

postForEntity

和getForEntity原理是一样的,下面会讲到。

2.2getForObject方法

getForObject指get请求,并返回一个Object对象。这里有3种方法。

  • 第1个参数:请求的url地址
  • 第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
  • 第3个参数:参数值,这里有Map和 可变参数两种形式

2.2.1

通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}

Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class,map);

接口端:

@RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}

2.2.2 通过可变参数的方式

也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样

String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class, "hello", "world");

2.3getForEntity方法

getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:

		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result

RestTemplate调用接口总结

1.这是接口信息

    @PostMapping("/testm")    public ReturnResult show11(@RequestParam("id") String id,                               @RequestParam("name") String name) {        System.out.println(id);        UserInfo userInfo = userInfoMapper.selectByUserName(name);         return ReturnResult.create(userInfo);    }

这是restTemplate调用

    //Post,@RequestParam---postForEntity    @Test    public void sho11() {        String url = "http://127.0.0.1:8099/user/testm";        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();        request.add("id", "12324");        request.add("name", "nanc");         ResponseEntity<ReturnResult> resp = restTemplate.postForEntity(url, request, ReturnResult.class);        ReturnResult body = resp.getBody();        UserInfo data = body.getData();        System.err.println(data.getUserId());        System.out.println(data);      }

2.接口

    @GetMapping("/testp")    public ReturnResult show22(@RequestParam String name,                               @RequestParam Integer age,                               @RequestParam String clazz) {        System.out.println(name + "-" + age + "-" + clazz);        UserInfo userInfo = userInfoMapper.selectByUserName(name);        return ReturnResult.create(userInfo);    }

resttemplate

    //Get ,@RequestParam-----getForObject    @Test    public void sho12() {        String url = "http://127.0.0.1:8099/rest/testp?name={name}&age={age}&clazz={clazz}";        Map<String, Object> map = new HashMap<>();        map.put("name", "nanc");        map.put("age", 34);        map.put("clazz", "12");        ReturnResult forObject = restTemplate.getForObject(url, ReturnResult.class, map);        UserInfo data = forObject.getData();        System.out.println(data);    } 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用SpringBoot跨系统调用接口的方案

    一.简介 项目开发中存在系统之间互调问题,又不想用dubbo,这里提供几种springboot方案: 1.使用Feign进行消费(推荐) 2.使用原始httpClient请求 3.使用RestTemplate方法 二.方案 方案一:使用Feign进行消费(推荐) 1.在maven中添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-st

  • SpringBoot 如何使用RestTemplate发送Post请求

    目录 背景: 1.待访问的API 2.返回对象 3.将发送Post请求的部分封装如下 4.UserInfo对象 5.在Service层封装将要发送的参数 6.在控制器中调用service中的方法,并返回数据 7.测试效果 Spring中有个RestTemplate类用来发送HTTP请求很方便,本文分享一个SpringBoot发送POST请求并接收返回数据的例子. 背景: 用户信息放在8081端口的应用上,8082端口应用通过调用api,传递参数,从8081端口应用的数据库中获取用户的信息. 1.

  • SpringBoot-RestTemplate如何实现调用第三方API

    目录 1.在build.grdle加入依赖 2.在config包下创建一个RestTemlateConfig 3.在model包下创建一个新的包 4.Constans类下将调用接口的AppKey值宏定义 5.在controller包下创建一个 6.用Postman调用接口,验证是否成功 1.在build.grdle加入依赖 implementation('org.springframework.boot:spring-boot-starter-web') 2.在config包下创建一个RestT

  • Springboot集成restTemplate过程详解

    一restTemplate简介 restTemplate底层是基于HttpURLConnection实现的restful风格的接口调用,类似于webservice,rpc远程调用,但其工作模式更加轻量级,方便于rest请求之间的调用,完成数据之间的交互,在springCloud之中也有一席之地.大致调用过程如下图 二restTemplate常用方法列表 forObeject跟forEntity有什么区别呢?主要的区别是forEntity的功能更加强大一些,其返回值是一个ResponseEntit

  • SpringBoot 如何使用RestTemplate来调用接口

    目录 使用RestTemplate来调用接口 1.新建一个配置类,配置RestTemplate的Bean import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframe

  • 解决RestTemplate 的getForEntity调用接口乱码的问题

    RestTemplate 的getForEntity调用接口乱码 有时候,当我们在SpringBoot项目中使用restTemplate去调用第三方接口时,会发现返回的body中出现了乱码,百度一搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP压缩过 默认情况下,restTemplate使用的是JDK的HTTP调用器,并

  • SpringBoot如何使用feign实现远程接口调用和错误熔断

    这篇文章主要介绍了SpringBoot如何使用feign实现远程接口调用和错误熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.第一步,新建两个简单的springboot项目并创建rest接口 demo系统的rest接口 plus系统的调用接口 2.在项目pom文件里导入feign和hystrix的pom依赖包 <properties> <java.version>1.8</java.version> <s

  • 从零开始学springboot整合feign跨服务调用的方法

    介绍 微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢? 答案是肯定的,feign就提供了轻便的方式! 如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,**feign + nacos**会帮你做剩余的事. 如果没有注册中心, 也无需担心, feign一样可以以传统的 ip:port 方式进行调用~ 下面,我们来实践下吧 springboot整合feign 引入依

  • 关于SpringBoot大文件RestTemplate下载解决方案

    近期基于项目上使用到的RestTemplate下载文件流,遇到1G以上的大文件,下载需要3-4分钟,因为调用API接口没有做分片与多线程, 文件流全部采用同步方式加载,性能很慢.最近结合网上案例及自己总结,写了一个分片下载tuling/fileServer项目: 1.包含同步下载文件流在浏览器加载输出相关代码: 2.包含分片多线程下载分片文件及合并文件相关代码: 另外在DownloadThread项目中使用代码完成了一个远程RestUrl请求去获取一个远端资源大文件进行多线程分片下载 到本地的一

  • SpringBoot实现定时任务和异步调用

    本文实例为大家分享了SpringBoot实现定时任务和异步调用的具体代码,供大家参考,具体内容如下 环境: jdk1.8:spring boot2.0.2:Maven3.3 摘要说明: 定时任务:定时任务是业务场景中经常出现的一种情况如:定时发送邮件,短信.定时统计监控数据.定时对账等 异步调用:一个都买流程可能包括下单.发货通知.短信推送.消息推送等,其实除了下单这个主要程序是主程序,其他子程序可以同时进行且不影响主程序的运行,这个时候就可以使用异步调用来调用这些子程序: 步骤: 1.定时任务

  • Springboot+redis+Interceptor+自定义annotation实现接口自动幂等

    前言: 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理.如何保证其幂等性,通常有以下手段: 1:数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据 2:token机制,每次接口请求前先获取一个token,然后再下次请求的时候在请求的header体中加上这个token,后台进行验证,如果验证通过删除token,下次请求再次判断toke

  • SpringBoot实现阿里云短信接口对接的示例代码

    前言 公司最近项目需要一个手机验证码的功能,任务确定后,倍感亚历山大,以为和第三方对接的都好麻烦,查阿里的API.网上大神写的博客,各种查之后才发现,简单的一塌糊涂,这里想说个问题,不知道其他的攻城狮们是不是和我一样的心里,刚接触个没做过的任务时,会一脸懵里的着急,无从下手的感觉,后来会了,就觉得简单的一*,在这里我说一下自己的体会,遇到任何难点,先理思路.任务拆分.逐个查资料,其实一套下来,就不会那种一脸懵逼的干着急... 所需条件 1.阿里云账户 2.开通云通讯中的短信服务 3.申请短信签名

  • SpringBoot使用Netty实现远程调用的示例

    前言 众所周知我们在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为.那么我们该通过什么技术去解决上述的问题呢,那么就不得不提一个网络连接的利器--Netty. 正文 Netty Netty是一个NIO客户端服务器框架: 它可快速轻松地开发网络应用程序,例如协议服务器和客户端. 它极大地简化和简化了网络编程,例如TCP和UDP套接字服务器. NIO是一种非阻塞IO ,它具有以下的特点 单线程可以连接多个客户

  • 在SpringBoot: SpringBoot里面创建导出Excel的接口教程

    在Web项目中,难免需要导出Excel这样的功能,后端接口怎么实现呢,Controller代码在下面,复制到项目的Controller中即可使用: 首先加入Excel的依赖,本例中我们用apache的poi: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dep

随机推荐