springboot配置并使用RestTemplate

打印 上一主题 下一主题

主题 823|帖子 823|积分 2469

目录
一、RestTemplate配置
1、将RestTemplate初始化为Bean
2、使用HttpClient作为RestTemplate客户端
(1)引入HttpClient依靠
(2)修改RestTemplate配置类
3、设置拦截器
(1)新增拦截器类
(2)设置拦截器
4、新增支持的媒体类型
二、RestTemplate使用
1、RestTemplate注入
2、无参数get请求测试
(1)Controller代码
(2)RestTemplate单元测试
3、带参get请求测试
(1)Controller代码
(2)RestTemplate单元测试
4、带占位符参数的get请求测试
(1)Controller代码
(2)RestTemplate单元测试
5、post请求测试
(1)Article实体类
(2)Controller代码
(3)RestTemplate单元测试
6、设置请求头
(1)Article实体类
(2)Controller代码
(3)RestTemplate单元测试
7、上传文件
(1)Controller代码
(2)RestTemplate单元测试
8、文件下载
(1)Controller代码
(2)RestTemplate单元测试
三、参考


一、RestTemplate配置

1、将RestTemplate初始化为Bean

  1. package com.xiaobai.conf;
  2. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. import java.util.Collections;
  7. /**
  8. * @Author 王天文
  9. * @Date 2024/12/29 18:06
  10. * @Description: RestTemplate配置类
  11. */
  12. @Configuration
  13. public class RestTemplateConf {
  14.     /**
  15.      * 当指定类型Bean不存在时,会创建一个新的Bean,如果用户自定义了Bean,将使用用户自定义的Bean
  16.      * @return
  17.      */
  18.     @ConditionalOnMissingBean(RestTemplate.class)
  19.     @Bean
  20.     public RestTemplate restTemplate() {
  21.         // 使用JDK自带的HttpURLConnection作为客户端
  22.         RestTemplate restTemplate = new RestTemplate();
  23.         return restTemplate;
  24.     }
  25. }
复制代码
2、使用HttpClient作为RestTemplate客户端

(1)引入HttpClient依靠

  1.         <!--httpclient-->
  2.         <dependency>
  3.             <groupId>org.apache.httpcomponents</groupId>
  4.             <artifactId>httpclient</artifactId>
  5.             <version>4.5.7</version>
  6.         </dependency>
复制代码
(2)修改RestTemplate配置类

  1. package com.xiaobai.conf;
  2. import org.apache.http.client.config.RequestConfig;
  3. import org.apache.http.impl.client.CloseableHttpClient;
  4. import org.apache.http.impl.client.HttpClientBuilder;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.http.client.ClientHttpRequestFactory;
  9. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  10. import org.springframework.web.client.RestTemplate;
  11. import java.util.Collections;
  12. /**
  13. * @Author 王天文
  14. * @Date 2024/12/29 18:06
  15. * @Description: RestTemplate配置类
  16. */
  17. @Configuration
  18. public class RestTemplateConf {
  19.     /**
  20.      * 当指定类型Bean不存在时,会创建一个新的Bean,如果用户自定义了Bean,将使用用户自定义的Bean
  21.      * @return
  22.      */
  23.     @ConditionalOnMissingBean(RestTemplate.class)
  24.     @Bean
  25.     public RestTemplate restTemplate() {
  26.         // 使用httpclient作为底层客户端
  27.         RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
  28.         return restTemplate;
  29.     }
  30.     /**
  31.      * 使用httpclient作为底层客户端
  32.      * @return
  33.      */
  34.     @Bean
  35.     public ClientHttpRequestFactory getClientHttpRequestFactory() {
  36.         int timeout = 50000;
  37.         RequestConfig requestConfig = RequestConfig.custom()
  38.                 .setConnectTimeout(timeout)
  39.                 .setConnectionRequestTimeout(timeout)
  40.                 .setSocketTimeout(timeout)
  41.                 .build();
  42.         CloseableHttpClient httpClient = HttpClientBuilder.create()
  43.                 .setDefaultRequestConfig(requestConfig)
  44.                 .build();
  45.         return new HttpComponentsClientHttpRequestFactory(httpClient);
  46.     }
  47. }
复制代码
3、设置拦截器

(1)新增拦截器类

  1. package com.xiaobai.conf;
  2. import org.springframework.http.HttpRequest;
  3. import org.springframework.http.client.ClientHttpRequestExecution;
  4. import org.springframework.http.client.ClientHttpRequestInterceptor;
  5. import org.springframework.http.client.ClientHttpResponse;
  6. import java.io.IOException;
  7. /**
  8. * @Author 王天文
  9. * @Date 2024/12/22 21:51
  10. * @Description: restTemplate拦截器
  11. */
  12. public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
  13.     @Override
  14.     public ClientHttpResponse intercept(HttpRequest httpRequest,
  15.                                         byte[] bytes,
  16.                                         ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
  17.         ClientHttpResponse httpResponse = clientHttpRequestExecution.execute(httpRequest, bytes);
  18.         return httpResponse;
  19.     }
  20. }
复制代码
(2)设置拦截器

  1. package com.xiaobai.conf;
  2. import org.apache.http.client.config.RequestConfig;
  3. import org.apache.http.impl.client.CloseableHttpClient;
  4. import org.apache.http.impl.client.HttpClientBuilder;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.http.client.ClientHttpRequestFactory;
  9. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  10. import org.springframework.web.client.RestTemplate;
  11. import java.util.Collections;
  12. /**
  13. * @Author 王天文
  14. * @Date 2024/12/29 18:06
  15. * @Description: RestTemplate配置类
  16. */
  17. @Configuration
  18. public class RestTemplateConf {
  19.     /**
  20.      * 当指定类型Bean不存在时,会创建一个新的Bean,如果用户自定义了Bean,将使用用户自定义的Bean
  21.      * @return
  22.      */
  23.     @ConditionalOnMissingBean(RestTemplate.class)
  24.     @Bean
  25.     public RestTemplate restTemplate() {
  26.         // 使用JDK自带的HttpURLConnection作为客户端
  27.         RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
  28.         // 设置拦截器
  29.         restTemplate.setInterceptors(Collections.singletonList(restTemplateInterceptor()));
  30.         return restTemplate;
  31.     }
  32.     /**
  33.      * 使用httpclient作为底层客户端
  34.      * @return
  35.      */
  36.     @Bean
  37.     public ClientHttpRequestFactory getClientHttpRequestFactory() {
  38.         int timeout = 50000;
  39.         RequestConfig requestConfig = RequestConfig.custom()
  40.                 .setConnectTimeout(timeout)
  41.                 .setConnectionRequestTimeout(timeout)
  42.                 .setSocketTimeout(timeout)
  43.                 .build();
  44.         CloseableHttpClient httpClient = HttpClientBuilder.create()
  45.                 .setDefaultRequestConfig(requestConfig)
  46.                 .build();
  47.         return new HttpComponentsClientHttpRequestFactory(httpClient);
  48.     }
  49.     /**
  50.      * 拦截器
  51.      * @return
  52.      */
  53.     @Bean
  54.     public RestTemplateInterceptor restTemplateInterceptor() {
  55.         return new RestTemplateInterceptor();
  56.     }
  57. }
复制代码
4、新增支持的媒体类型

RestTemplate 只支持application/json格式,需要手动补充text/plan,text/html格式
  1. package com.xiaobai.conf;
  2. import org.apache.http.client.config.RequestConfig;
  3. import org.apache.http.impl.client.CloseableHttpClient;
  4. import org.apache.http.impl.client.HttpClientBuilder;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.http.MediaType;
  9. import org.springframework.http.client.ClientHttpRequestFactory;
  10. import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
  11. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  12. import org.springframework.web.client.RestTemplate;
  13. import java.util.Arrays;
  14. import java.util.Collections;
  15. /**
  16. * @Author 王天文
  17. * @Date 2024/12/29 18:06
  18. * @Description: RestTemplate配置类
  19. */
  20. @Configuration
  21. public class RestTemplateConf {
  22.     /**
  23.      * 当指定类型Bean不存在时,会创建一个新的Bean,如果用户自定义了Bean,将使用用户自定义的Bean
  24.      * @return
  25.      */
  26.     @ConditionalOnMissingBean(RestTemplate.class)
  27.     @Bean
  28.     public RestTemplate restTemplate() {
  29.         // 使用JDK自带的HttpURLConnection作为客户端
  30.         RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
  31.         // 设置拦截器
  32.         restTemplate.setInterceptors(Collections.singletonList(restTemplateInterceptor()));
  33.         // 增加支持的媒体类型
  34.         restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter());
  35.         return restTemplate;
  36.     }
  37.     /**
  38.      * 使用httpclient作为底层客户端
  39.      * @return
  40.      */
  41.     @Bean
  42.     public ClientHttpRequestFactory getClientHttpRequestFactory() {
  43.         int timeout = 50000;
  44.         RequestConfig requestConfig = RequestConfig.custom()
  45.                 .setConnectTimeout(timeout)
  46.                 .setConnectionRequestTimeout(timeout)
  47.                 .setSocketTimeout(timeout)
  48.                 .build();
  49.         CloseableHttpClient httpClient = HttpClientBuilder.create()
  50.                 .setDefaultRequestConfig(requestConfig)
  51.                 .build();
  52.         return new HttpComponentsClientHttpRequestFactory(httpClient);
  53.     }
  54.     /**
  55.      * 拦截器
  56.      * @return
  57.      */
  58.     @Bean
  59.     public RestTemplateInterceptor restTemplateInterceptor() {
  60.         return new RestTemplateInterceptor();
  61.     }
  62.     /**
  63.      * 媒体类型
  64.      * @return
  65.      */
  66.     @Bean
  67.     public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
  68.         // RestTemplate 只支持application/json格式,需要手动补充text/html格式
  69.         MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
  70.         mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_PLAIN, MediaType.TEXT_HTML));
  71.         return mappingJackson2HttpMessageConverter;
  72.     }
  73. }
复制代码
二、RestTemplate使用

1、RestTemplate注入

  1.     @Autowired
  2.     private RestTemplate restTemplate;
复制代码
2、无参数get请求测试

(1)Controller代码

  1.     @GetMapping(value = "/getString")
  2.     public String getString() {
  3.         return "操作成功";
  4.     }
复制代码
(2)RestTemplate单元测试

  1.     @Test
  2.     public void testGetString() {
  3.         ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://localhost:8090/getString", String.class);
  4.         log.info(responseEntity.getBody());
  5.     }
复制代码
3、带参get请求测试

(1)Controller代码

  1.     @GetMapping("/getRequestByParam")
  2.     public Map<String, Object> getRequestByParam(@RequestParam("name") String name) {
  3.         log.info("名称:" + name);
  4.         Map<String, Object> map = new HashMap<>();
  5.         map.put("responseData", "请求成功");
  6.         return map;
  7.     }
复制代码
(2)RestTemplate单元测试

  1.     @Test
  2.     public void testParamGet() throws Exception {
  3.         Map<String, Object> param = new HashMap<>();
  4.         param.put("name", "张三");
  5.         ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://localhost:8090/getRequestByParam?name={name}", String.class, param);
  6.         log.info("响应信息:{}", responseEntity.getBody());
  7.     }
复制代码
4、带占位符参数的get请求测试

(1)Controller代码

  1.     @GetMapping("/getRequestByPlaceHolder/{name}/{age}")
  2.     public Map<String, Object> getRequestByPlaceHolder(@PathVariable("name") String name,
  3.                                                        @PathVariable("age") String age) {
  4.         log.info("名称:" + name);
  5.         log.info("年龄:" + age);
  6.         Map<String, Object> map = new HashMap<>();
  7.         map.put("responseData", "请求成功");
  8.         return map;
  9.     }
复制代码
(2)RestTemplate单元测试

  1.     @Test
  2.     public void testPlaceholderGet() {
  3.         ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://localhost:8090/getRequestByPlaceHolder/{1}/{2}", String.class, "张三", "25");
  4.         log.info("响应信息:{}", responseEntity.getBody());
  5.     }
复制代码
5、post请求测试

(1)Article实体类

  1. package com.xiaobai.aroundtest.entity;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. /**
  5. * @author wangtw
  6. * @date 2023/12/6 0:35
  7. * @description
  8. */
  9. @Data
  10. public class Article implements Serializable {
  11.     private static final long serialVersionUID = 1L;
  12.     /**
  13.      * 文章名称
  14.      */
  15.     private String name;
  16.     /**
  17.      * 描述
  18.      */
  19.     private String description;
  20. }
复制代码
(2)Controller代码

  1.     @PostMapping("/postRequest")
  2.     public Map<String, Object> postRequest(@RequestParam String name, @RequestBody Article article) {
  3.         log.info("名称:" + name);
  4.         log.info("文章名称:" + article.getName());
  5.         log.info("文章描述:" + article.getDescription());
  6.         Map<String, Object> map = new HashMap<>();
  7.         map.put("responseData", "请求成功");
  8.         return map;
  9.     }
复制代码
(3)RestTemplate单元测试

  1.     @Test
  2.     public void testPost() {
  3.         // 表单数据
  4.         Map<String, Object> formData = new HashMap<>();
  5.         formData.put("name", "解忧杂货店");
  6.         formData.put("description", "这是一本好书");
  7.         // 单独传参
  8.         Map<String, Object> param = new HashMap<>();
  9.         param.put("name", "东野圭吾");
  10.         // 请求调用
  11.         HttpEntity<Map<String, Object>> formEntity = new HttpEntity<>(formData);
  12.         ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:8090/postRequest?name={name}", formEntity, String.class, param);
  13.         log.info("响应信息:{}", responseEntity.getBody());
  14.     }
复制代码
6、设置请求头

(1)Article实体类

  1. package com.xiaobai.aroundtest.entity;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. /**
  5. * @author wangtw
  6. * @date 2023/12/6 0:35
  7. * @description
  8. */
  9. @Data
  10. public class Article implements Serializable {
  11.     private static final long serialVersionUID = 1L;
  12.     /**
  13.      * 文章名称
  14.      */
  15.     private String name;
  16.     /**
  17.      * 描述
  18.      */
  19.     private String description;
  20. }
复制代码
(2)Controller代码

  1.     @PostMapping("/postRequestHeader")
  2.     public Map<String, Object> postRequestHeader(HttpServletRequest request,
  3.                                                  @RequestParam String name, @RequestBody Article article) {
  4.         String token = request.getHeader("token");
  5.         log.info("请求token:" + token);
  6.         log.info("名称:" + name);
  7.         log.info("文章名称:" + article.getName());
  8.         log.info("文章描述:" + article.getDescription());
  9.         Map<String, Object> map = new HashMap<>();
  10.         map.put("responseData", "请求成功");
  11.         return map;
  12.     }
复制代码
(3)RestTemplate单元测试

  1.     @Test
  2.     public void testPostHeader() {
  3.         // 请求头
  4.         HttpHeaders httpHeaders = new HttpHeaders();
  5.         httpHeaders.add("token", "123456");
  6.         // 表单数据
  7.         Map<String, Object> formData = new HashMap<>();
  8.         formData.put("name", "解忧杂货店");
  9.         formData.put("description", "这是一本好书");
  10.         // 单独传参
  11.         Map<String, Object> param = new HashMap<>();
  12.         param.put("name", "东野圭吾");
  13.         // 请求调用
  14.         HttpEntity<Map<String, Object>> formEntity = new HttpEntity<>(formData, httpHeaders);
  15.         ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:8090/postRequestHeader?name={name}", formEntity, String.class, param);
  16.         log.info("响应信息:{}", responseEntity.getBody());
  17.     }
复制代码
7、上传文件

(1)Controller代码

  1.     @PostMapping("/upload")
  2.     public Map<String, Object> upload(@RequestParam String name, MultipartFile uploadFile) throws IOException {
  3.         log.info("名称:" + name);
  4.         uploadFile.transferTo(new File("D:\\temp/" + uploadFile.getOriginalFilename()));
  5.         Map<String, Object> map = new HashMap<>();
  6.         map.put("responseData", "请求成功");
  7.         return map;
  8.     }
复制代码
(2)RestTemplate单元测试

  1.     @Test
  2.     public void testUploadFile() {
  3.         MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
  4.         param.add("uploadFile", new FileSystemResource(new File("D:\\christmas-tree.svg")));
  5.         param.add("name", "张三");
  6.         // 请求头设置
  7.         HttpHeaders headers = new HttpHeaders();
  8.         headers.setContentType(MediaType.MULTIPART_FORM_DATA);
  9.         // 请求调用
  10.         HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(param, headers);
  11.         ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://localhost:8090/upload", formEntity, String.class);
  12.         log.info("响应信息:{}", responseEntity.getBody());
  13.     }
复制代码
8、文件下载

(1)Controller代码

  1.     @PostMapping("/download")
  2.     public Map<String, Object> download(@RequestParam String fileName,
  3.                                         HttpServletResponse response) {
  4.         log.info("文件名称:" + fileName);
  5.         File file = new File("D:\\temp/" + fileName);
  6.         try(FileInputStream fileInputStream = new FileInputStream(file);
  7.             ServletOutputStream outputStream = response.getOutputStream()) {
  8.             response.setHeader("content-disposition","attachment;fileName=" + URLEncoder.encode(fileName,"UTF-8"));
  9.             FileCopyUtils.copy(fileInputStream, outputStream);
  10.         } catch (Exception e) {
  11.             e.printStackTrace();
  12.         }
  13.         Map<String, Object> map = new HashMap<>();
  14.         map.put("responseData", "请求成功");
  15.         return map;
  16.     }
复制代码
(2)RestTemplate单元测试

  1.     @Test
  2.     public void testDownloadFile() {
  3.         MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
  4.         param.add("fileName", "christmas-tree.svg");
  5.         // 请求调用
  6.         HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(param);
  7.         ResponseEntity<byte[]> responseEntity = restTemplate.postForEntity("http://localhost:8090/download", formEntity, byte[].class);
  8.         // 获取响应头
  9.         HttpHeaders responseEntityHeaders = responseEntity.getHeaders();
  10.         Set<Map.Entry<String, List<String>>> responseSet = responseEntityHeaders.entrySet();
  11.         for (Map.Entry<String, List<String>> responseValue : responseSet) {
  12.             log.info("响应头:" + responseValue.getKey() + ",响应内容:" + responseValue.getValue());
  13.         }
  14.         try {
  15.             // 文件保存
  16.             byte[] fileData = responseEntity.getBody();
  17.             FileCopyUtils.copy(fileData, new File("D:\\christmas-tree1.svg"));
  18.         } catch (IOException e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
复制代码
三、参考

   Spring之RestTemplate详解

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表