参考:【B站视频】Java Web 编程 之 RestTemplate 实战全集 & SpringBoot & Spring 框架集成
Springboot整合RestTemplate、java调用http请求方式、
RestTemplate工具类,支持http和https请求以及http携带body请求

第一步、定义一个配置类

  1. package com.tj.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. /**
  6. * HTTP请求模版
  7. */
  8. @Configuration
  9. public class RestTemplateConfig {
  10. @Bean
  11. public RestTemplate restTemplate() {
  12. /**
  13. 默认底层执行 HttpURLConnection
  14. 可以指定如下不同的类
  15. Apache HttpComponentsClientHttpRequestFactory()
  16. Netty Netty4ClientHttpRequestFactory()
  17. OkHttp OkHttp3ClientHttpRequestFactory()
  18. */
  19. return new RestTemplate();
  20. }
  21. }

如果不定义配置类,也可以通过new RestTemplate()直接使用

HttpGet请求介绍

  1. //可以获取对象
  2. restTemplate.getForObject();
  3. //不仅可以获取对象,还可以获取http状态码,请求头等详细信息
  4. restTemplate.getForEntity();

使用案例getForObject

  1. @Autowired
  2. private RestTemplate restTemplate;
  3. @Autowired
  4. private BaseNumvarService baseNumvarService;
  5. @Test
  6. public void testGetForObject() {
  7. String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={ID}&corpsecret={SECRET}";
  8. String corpid = baseNumvarService.getCorpid();
  9. String secret_txl = baseNumvarService.getSecret_txl();
  10. HashMap<String, String> map = MapUtils.newHashMap();
  11. map.put("ID", corpid);
  12. map.put("SECRET", secret_txl);
  13. /**
  14. 第一个参数:请求地址
  15. 第二个参数:返回值类型
  16. 第三个参数:请求携带的参数,注意,map里的字段要和url里的占位符字符对应
  17. */
  18. Map<String, Object> res = restTemplate.getForObject(url,Map.class,map);
  19. log.info(res.toString());
  20. }

使用案例GetForEntity

  1. @Autowired
  2. private RestTemplate restTemplate;
  3. @Autowired
  4. private BaseNumvarService baseNumvarService;
  5. @Test
  6. public void testGetForEntity() {
  7. String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={ID}&corpsecret={SECRET}";
  8. HashMap<String, String> map = MapUtils.newHashMap();
  9. map.put("ID", baseNumvarService.getCorpid());
  10. map.put("SECRET", baseNumvarService.getSecret_txl());
  11. /**
  12. 第一个参数:请求地址
  13. 第二个参数:返回值类型
  14. 第三个参数:请求携带的参数,注意,map里的字段要和url里的占位符字符对应
  15. */
  16. ResponseEntity<HashMap> entity = restTemplate.getForEntity(url, HashMap.class, map);
  17. //返回状态码
  18. int statusCodeValue = entity.getStatusCodeValue();
  19. log.info("状态码:{}", statusCodeValue);
  20. //http返回头
  21. HttpHeaders headers = entity.getHeaders();
  22. log.info("http返回头:{}", headers);
  23. //返回对应的请求结果
  24. HashMap body = entity.getBody();
  25. log.info("请求结果:{}", body);
  26. }

image.png

HttpPOST请求介绍

RestTemplate的POST方法与Get方法的区别是post方法传参数Map必须是MultiValueMap
Post方法的MultiValueMap既支持基本类型分开传参,也支持实体传参。类似下面的形式

JSON请求

参数1:请求地址
参数2:可以是java对象,JSON字符串
参数3:返回值的类型

  1. @Test
  2. public void testPostForObject() {
  3. String secretCheckin = baseNumvarService.getSecretCheckin();
  4. String token = baseNumvarService.getAccessTokenBySecret(secretCheckin);
  5. String url = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=" + token;
  6. String json = "{\n" +
  7. " \"opencheckindatatype\": 3,\n" +
  8. " \"starttime\": 1654088401,\n" +
  9. " \"endtime\": 1654520401,\n" +
  10. " \"useridlist\": [\"a00000000XingXianXiaoLiMuYe13753\"]" +
  11. "}";
  12. //POST请求
  13. Map map = restTemplate.postForObject(url, json, Map.class);
  14. log.info(map.toString());
  15. }