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

RestTemplate 实现后端 HTTP 调用详解

1. 方法签名

解析

  • 方法名和返回类型说明了这个方法的业务意图和数据结构。

  • @Override 表示实现接口方法,利于规范开发和自动检查。

    @Override
    public List<RobotInfo> listRobots() {
    

    这里 RobotInfo 是假设的业务数据结构,实际项目中按你的类名即可。

2. 拼接请求 URL

解析

  • 组装目标 API 的完整地址,通常包含基础域名(可配置)+ 路径 + 查询参数。

  • 日志打印有助于排查接口调用问题。

    String url = baseUrl + "/api/v1/robots?page=1&pageSize=10";
    log.debug("请求URL: {}", url);
    

3. 构造 HTTP 请求头

解析

  • HTTP 请求头用于声明认证、数据格式等关键信息。

  • 常见如:Authorization(认证),Content-Type(数据类型)。

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + getToken());
headers.setContentType(MediaType.APPLICATION_JSON);

4. 组装请求实体

解析

  • GET 请求一般没有请求体,只需要带请求头。

  • 通过 HttpEntity 组合请求头与请求体(这里体为 null)。

    HttpEntity<Void> entity = new HttpEntity<>(headers);
    

5. 发起 HTTP 请求并获取响应

解析

  • RestTemplate.exchange() 发送 GET 请求,接收响应并自动反序列化为指定类型。

  • ResponseEntity 可拿到完整响应内容(状态码、响应头、响应体)。

ResponseEntity<RobotListResponse> resp = restTemplate.exchange(url,HttpMethod.GET,entity,RobotListResponse.class
);

6. 解析和返回业务数据

解析

  • 判空处理,避免空指针异常。

  • 返回核心业务数据,便于后续处理。

RobotListResponse body = resp.getBody();
return (body != null && body.getRobots() != null)? body.getRobots(): Collections.emptyList();

完整示例代码

@Override
public List<RobotInfo> listRobots() {// 1. 拼接请求 URLString url = baseUrl + "/api/v1/robots?page=1&pageSize=10";log.debug("请求URL: {}", url);// 2. 构造 HTTP 请求头HttpHeaders headers = new HttpHeaders();headers.set("Authorization", "Bearer " + getToken());headers.setContentType(MediaType.APPLICATION_JSON);// 3. 组装请求实体HttpEntity<Void> entity = new HttpEntity<>(headers);// 4. 发起请求并获取响应ResponseEntity<RobotListResponse> resp = restTemplate.exchange(url,HttpMethod.GET,entity,RobotListResponse.class);// 5. 解析和返回RobotListResponse body = resp.getBody();return (body != null && body.getRobots() != null)? body.getRobots(): Collections.emptyList();
}

http://www.lryc.cn/news/589583.html

相关文章:

  • python 基于 httpx 的流式请求
  • kube-proxy 中 IPVS 与 iptables
  • Vue 2 和 Vue 3 中,组件的封装、二次开发和优化
  • React源码4 三大核心模块之一:Schedule,scheduleUpdateOnFiber函数
  • react - 根据路由生成菜单
  • 使用SQLMAP的文章管理系统CMS的sql注入渗透测试
  • PostgreSQL 大数据量(超过50GB)导出方案
  • DeepSDF论文复现1---数据集生成2---原理解析
  • MIPI DSI(五) DBI 和 DPI 格式
  • 生产问题排查-数据库连接池耗尽
  • bytetrack漏检补齐
  • 2025年夏Datawhale AI夏令营机器学习
  • 数据怎么分层?从ODS、DW、ADS三大层一一拆解!
  • Flink Watermark原理与实战
  • omniparser v2 本地部署及制作docker镜像(20250715)
  • 驱动开发系列61- Vulkan 驱动实现-SPIRV到HW指令的实现过程(2)
  • 定时器更新中断与串口中断
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • 2-Nodejs运行JS代码
  • 基于按键开源MultiButton框架深入理解代码框架(二)(指针的深入理解与应用)
  • css-css执行的三种方式和css选择器
  • 【leetcode】263.丑数
  • 邮件伪造漏洞
  • 再见吧,Windows自带记事本,这个轻量级文本编辑器太香了
  • Rust基础[part4]_基本类型,所有权
  • Java 集合 示例
  • 【Qt】插件机制详解:从原理到实战
  • redisson tryLock
  • HAProxy双机热备,轻松实现负载均衡