当前位置: 首页 > news >正文

Spring RestTemplate修仙指南:从HTTP萌新到请求大能的终极奥义

各位在Spring生态摸爬滚打的道友们!今天要解锁的是Spring官方御用HTTP法宝——RestTemplate!这货堪称Java界的"御剑飞行术",虽然官方已推荐WebClient接棒,但江湖上仍有80%项目在用这员老将!准备好一键起飞了吗? 🚀


一、筑基篇:初识RestTemplate

1.1 召唤法宝(创建实例)
// 简单召唤(无配置版)
RestTemplate restTemplate = new RestTemplate();

// 注入灵力版(推荐Spring Bean方式)
@Bean 
public RestTemplate restTemplate() {
    return new RestTemplate();
}
1.2 基础GET请求(探查敌情)
String url = "https://api.example.com/users/1";
// 方式1:直接获取字符串
String response = restTemplate.getForObject(url, String.class);

// 方式2:获取完整响应(含状态码/头信息)
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
System.out.println("状态码:" + entity.getStatusCode());
System.out.println("响应体:" + entity.getBody());

二、金丹篇:高级请求术

2.1 POST请求(传送灵力)
// 准备请求体(自动序列化为JSON)
User user = new User("张无忌", 25);
ResponseEntity<User> response = restTemplate.postForEntity(
    "https://api.example.com/users",
    user,  // 请求体对象
    User.class  // 响应类型
);

// 获取创建成功的用户ID(假设返回完整用户对象)
User createdUser = response.getBody();
System.out.println("新用户ID:" + createdUser.getId());
2.2 自定义请求头(伪装大法)
// 方式1:使用HttpHeaders
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your_token");
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<User> requestEntity = new HttpEntity<>(user, headers);
ResponseEntity<User> response = restTemplate.exchange(
    url, 
    HttpMethod.POST, 
    requestEntity, 
    User.class
);

// 方式2:使用拦截器(全局生效)
@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getInterceptors().add((request, body, execution) -> {
        request.getHeaders().add("X-App-Version", "1.0.0");
        return execution.execute(request, body);
    });
    return restTemplate;
}

三、元婴篇:异常处理

3.1 统一错误处理(渡劫护盾)
try {
    ResponseEntity<User> response = restTemplate.getForEntity(url, User.class);
} catch (HttpClientErrorException e) {
    // 4xx错误处理
    System.err.println("客户端异常:" + e.getStatusCode() + ", " + e.getResponseBodyAsString());
} catch (HttpServerErrorException e) {
    // 5xx错误处理
    System.err.println("服务端异常:" + e.getStatusCode());
} catch (RestClientException e) {
    // 其他网络异常
    System.err.println("网络异常:" + e.getMessage());
}
3.2 自定义ResponseErrorHandler
@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
            if (response.getStatusCode() == HttpStatus.NOT_FOUND) {
                throw new CustomNotFoundException("资源不存在");
            }
            // 其他异常处理...
        }
    });
    return restTemplate;
}

四、化神篇:性能优化

4.1 连接池配置(灵气循环)
@Bean
public RestTemplate restTemplate() {
    // 使用HttpComponentsClientHttpRequestFactory(需httpclient依赖)
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    
    // 连接池配置
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    connectionManager.setMaxTotal(200); // 最大连接数
    connectionManager.setDefaultMaxPerRoute(50); // 单路由最大连接
    
    CloseableHttpClient httpClient = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();
    
    factory.setHttpClient(httpClient);
    factory.setConnectTimeout(5000); // 连接超时
    factory.setReadTimeout(30000);   // 读取超时
    
    return new RestTemplate(factory);
}
4.2 启用GZIP压缩(缩地成寸)
@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters()
        .add(0, new GzipHttpMessageConverter()); // 自定义GZIP转换器
    return restTemplate;
}

五、大乘篇:实战技巧

5.1 文件上传(乾坤大挪移)
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("file", new FileSystemResource("avatar.jpg"));
parts.add("metadata", new User("张无忌", 25)); // 同时传文件和JSON

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

ResponseEntity<String> response = restTemplate.exchange(
    uploadUrl,
    HttpMethod.POST,
    new HttpEntity<>(parts, headers),
    String.class
);
5.2 文件下载(隔空取物)
ResponseEntity<Resource> response = restTemplate.exchange(
    downloadUrl,
    HttpMethod.GET,
    null,
    Resource.class
);

try (InputStream is = response.getBody().getInputStream()) {
    Files.copy(is, Paths.get("downloaded_file.zip"));
}

飞升指南:最佳实践

  1. 实例复用:RestTemplate线程安全,建议全局单例
  2. 超时配置:生产环境必须设置连接/读取超时
  3. 异常处理:区分业务异常和网络异常
  4. 性能监控:集成Micrometer监控请求指标

渡劫后选择

  • 升级法宝:迁移到响应式WebClient
  • 深度修炼:集成Hystrix实现熔断降级
  • 跨界融合:与Feign结合打造声明式客户端

相关文章:

  • 【VS Code】为什么vscode已经关闭,http://localhost:5173/还可以打开或项目还在运行,端口被占用
  • 软件工程面试题(三十二)
  • 如何计算卷积的复杂度、卷积层的参数量
  • 基于springboot+vue的漫画天堂网
  • frp内网穿透零基础详细教程
  • 03.31-04.06 论文速递 聚焦具身智能、复杂场景渲染、电影级对话生成等五大前沿领域
  • 如何解决uniapp打包安卓只出现功能栏而无数据的问题
  • 优雅实现级联选择器:CascadeSelect 类设计与实现
  • 第4课:列表渲染与条件渲染
  • Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(2)
  • Java 集合框架与 Stream 流深入剖析(重点详细讲解)
  • langchain实现基于语义分块的文档处理技术semantic-chunker
  • 小飞电视 2.7.0 | 高清秒播无卡顿的电视直播软件
  • 大模型部署实践第一天——基于Colab体验完整部署流程
  • C语言中单向链表:创建节点与插入新节点
  • lerobot[部署,元数据集,加载数据集]
  • Java学习总结-线程同步
  • keil5忽略警告
  • S32K144入门笔记(二十五):FlexCAN初始化序列
  • LeetCode 1169 查询无效交易
  • 做网站需要多少固定带宽/品牌策划包括哪几个方面
  • 网站开发 图片存放/seo专业培训中心
  • 天天联盟没网站怎么做/百度竞价排名展示方式
  • 广西送变电建设公司铁塔厂网站/关键词权重查询
  • 做网站多少钱角西宁君博特惠/短视频seo关键词
  • 西昌市网站建设公司/一媒体app软件下载老版本