如何优雅的使用 RestTemplate

简介: 如何优雅的使用 RestTemplate

一、概述

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

二、配置

1、引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2、添加配置交由spring管理

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(30*1000);
        requestFactory.setReadTimeout(30*1000);
        return new RestTemplate(requestFactory);
    }
}

三、快速使用

1、GET请求

1.1、无参无请求头的方式

String url="http://127.0.0.1:9999/test/restTemplateTest";
    JSONObject jsonObject = restTemplate.getForObject(url,JSONObject.class);
String url="http://127.0.0.1:9999/test/restTemplateTest";
    ResponseEntity<JSONObject> jsonObject = restTemplate.getForEntity(url,JSONObject.class);

1.2、无参并指定请求头的方式

paramMap 是空

Map<String, Object> paramMap = new HashMap<String, Object>();
        //设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.add("auth","123445");
        HttpEntity<Object> entity = new HttpEntity<>(paramMap,headers);
        ResponseEntity<JSONObject> result = restTemplate.exchange(url, HttpMethod.GET, entity, JSONObject.class, paramMap);
        if (result.getStatusCodeValue() == 200){
            JSONObject body = result.getBody();
        }

1.3、有参的方式

记得要在url中拼接参数 url + “?userId={userId}”

Map<String, String> paramMap = new HashMap<>();
        paramMap.put("userId", "123456");
        ResponseEntity<JSONObject> result = restTemplate.getForEntity(url + "?userId={userId}", JSONObject.class, paramMap);
        if (result.getStatusCodeValue() == 200){
            JSONObject body = result.getBody();
        }

1.4、有参并指定请求头

Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("userId", "123456");
        //设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.add("auth","123445");
        HttpEntity<Object> entity = new HttpEntity<>(paramMap,headers);
        ResponseEntity<JSONObject> result = restTemplate.exchange(url + "?userId={userId}", HttpMethod.GET, entity, JSONObject.class, paramMap);
        if (result.getStatusCodeValue() == 200){
            JSONObject body = result.getBody();
        }

1.5、优雅的拼接参数

我们发现带参数的get请求需要将参数拼接到url中,参数少好说,参数多了就很麻烦

我们使用UriComponentsBuilder来解决

MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("userId", "123456");
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
        URI uri = builder.queryParams(paramMap).build().encode(StandardCharsets.ISO_8859_1).toUri();
        ResponseEntity<JSONObject> result = restTemplate.getForEntity(uri, JSONObject.class);
        if (result.getStatusCodeValue() == 200){
            JSONObject body = result.getBody();
        }

1.6、优雅的拼接参数并携带请求头

MultiValueMap<String, String> multiValueMap = TaskCenterDataConvert.taskSearchDTOToMultiValueMap(taskSearchDTO);
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(taskCenterListSearchUrl);
        URI uri = builder.queryParams(multiValueMap).build().encode(StandardCharsets.ISO_8859_1).toUri();
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization","Bearer " + authorization);
        HttpEntity<JSONObject> httpEntity = new HttpEntity<>(null, headers);
        ResponseEntity<JSONObject> result = restTemplate.exchange(uri.toString(), HttpMethod.GET, httpEntity, JSONObject.class, multiValueMap);
        if (result.getStatusCodeValue() == 200){
            JSONObject body = result.getBody();
          
            }
        }

1.7、getForObject 、getForEntity和exchange 区别

post请求也是相同的道理

  • getForObject 返回值直接是响应体内容转为指定的对象
  • getForEntity 返回值的封装包含有响应头, 响应状态码的 ResponseEntity 对象
  • exchange 可以指定为get请求或者post请求,并且返回ResponseEntity 对象

2、POST请求

2.1、application/json 的方式

其中参数可以指定为map json 或者bean的形式

Map<String, String> paramMap = new HashMap<>();
        paramMap.put("userId", "123456");
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type","application/json");
        headers.add("auth","12334455666");
        HttpEntity<Object> entity = new HttpEntity<Object>(paramMap,headers);
        JSONObject result = restTemplate.postForObject(url, entity,JSONObject.class);

2.1、表单的方式

MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        paramMap.add("userId", "123456");
        //设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/x-www-form-urlencoded");
        headers.add("auth","12334455666");
        HttpEntity<Object> entity = new HttpEntity<Object>(paramMap, headers);
        JSONObject result = restTemplate.postForObject(url, entity, JSONObject.class);

注意:

使用 RestTemplate 提交表单时必须使用 MultiValueMap来传参

是因为是用HashMap定义的参数在使用表单方式传递的时候,最终数据是以json形式传过去的

MultiValueMap 和 Map的区别:

MultiValueMap 一个 key 可以对应多个 value

Map 一个 key 对应一个 value

文章持续更新,可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」第一时间阅读,获取更完整的链路资料。

相关文章
|
域名解析 Linux Docker
CentOS8 安装 Docker
本文主要为大家讲解在CentOS8 上安装 Docker的过程,以及安装中的常见问题解决。
24137 2
CentOS8 安装 Docker
|
前端开发 Go C++
CSS命名规则规范整理
大家在写css的时候,经常会遇到关于命名的问题。页面上成百甚至上千的class或者id,我们就会越来越感到困扰。 所以,这样我们就很有必要整理自己的一套命名规范。
9838 0
CSS命名规则规范整理
|
存储 easyexcel Java
EasyExcel教程
EasyExcel教程
16676 0
|
10月前
|
前端开发 安全 Java
2025春招,Spring 面试题汇总
本文详细整理了2025年春招必备的Spring面试题,分为基础和高级两大部分,帮助求职者全面掌握Spring相关知识点,结合实际项目经验,提升面试成功率。内容涉及Spring框架、AOP、事务管理、数据库集成、Spring Boot、Spring Security、微服务架构等,助力你在春招中脱颖而出。
2186 0
|
6月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
9602 33
MCP客户端调用看这一篇就够了(Java版)
|
Java UED Spring
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
5692 1
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
3671 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)