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 */ @Configuration public 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}¶m2={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}¶m2={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); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
原文出处:https://blog.csdn.net/likekobe2012/article/details/82663725
相关文章
解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
- 这篇文章主要介绍了SpringBoot集成Redis实现消息队列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
Spring Boot项目@RestController使用重定向redirect方式
这篇文章主要介绍了Spring Boot项目@RestController使用重定向redirect方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-02- 这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
- 这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
详解SpringBoot之访问静态资源(webapp...)
这篇文章主要介绍了详解SpringBoot之访问静态资源(webapp...),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-14- 这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
springboot中使用@Transactional注解事物不生效的坑
这篇文章主要介绍了springboot中使用@Transactional注解事物不生效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26- 这篇文章主要介绍了springboot多模块包扫描问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解
这篇文章主要介绍了Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-18- 这篇文章主要介绍了Springboot实现多线程注入bean的工具类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-27
Springboot+MDC+traceId日志中打印唯一traceId
本文主要介绍了Springboot+MDC+traceId日志中打印唯一traceId,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-17SpringBoot部署到Linux读取resources下的文件及遇到的坑
本文主要给大家介绍SpringBoot部署到Linux读取resources下的文件,在平时业务开发过程中,很多朋友在获取到文件内容乱码或者文件读取不到的问题,今天给大家分享小编遇到的坑及处理方案,感兴趣的朋友跟随小编一起看看吧...2021-06-21- 这篇文章主要介绍了springboot中nacos动态路由的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
SpringBoot高版本修改为低版本时测试类报错的解决方案
这篇文章主要介绍了SpringBoot高版本修改为低版本时测试类报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-18解决Springboot整合shiro时静态资源被拦截的问题
这篇文章主要介绍了解决Springboot整合shiro时静态资源被拦截的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-26- 这篇文章主要介绍了详解SpringBoot读取配置文件的N种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10