<前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

咱今儿个唠唠 Spring Boot 里头咋整 RESTful API。这玩意儿吧,说难不难,说简单也不简单,整好了是 API,整不好就是 AP(挨批)。你要是刚入门,那可得悠着点儿,别一上来就整得自己“骨折”了。

二、Spring MVC 和 RESTful API 是啥关系?

Spring MVC 是 Spring 里头用来搞 Web 开发的框架,RESTful API 呢,就是一种设计风格,讲究用 HTTP 协议里头的 GET、POST、PUT、DELETE 这些方法来操作资源。Spring MVC 里头有个叫 @Controller 的注解,专门用来处理 HTTP 请求,跟 RESTful API 那是天造地设的一对儿。

1. Controller 是咋回事?

Controller 就是 Spring MVC 里头的一个组件,专门负责处理请求和返回响应。你可以把它想象成一个“接线员”,客户端的请求来了,它得接电话,然后根据请求的内容,决定该干啥。

Java Code

@RestController

@RequestMapping("/api")

public class MyController {

    @GetMapping("/hello")

    public String sayHello() {

        return "Hello, World!";

    }

}

这段代码里头,@RestController 是 @Controller 和 @ResponseBody 的结合体,意思就是这个类里头的方法返回的都是直接写给客户端的数据,不用再整啥视图解析了。@RequestMapping 是用来映射 URL 的,/api 就是根路径,/hello 就是子路径。

2. RESTful 风格的 URL 设计

RESTful 风格的 URL 讲究的是“资源”和“操作”。比如说,你要操作一个用户资源,那 URL 就得设计成 /users,然后根据不同的 HTTP 方法来做不同的操作:

  • GET /users:获取所有用户
  • GET /users/{id}:获取某个用户
  • POST /users:创建一个用户
  • PUT /users/{id}:更新某个用户
  • DELETE /users/{id}:删除某个用户

Java Code

@RestController

@RequestMapping("/users")

public class UserController {

    @GetMapping

    public List<User> getUsers() {

        // 返回所有用户

    }

    @GetMapping("/{id}")

    public User getUser(@PathVariable Long id) {

        // 返回某个用户

    }

    @PostMapping

    public User createUser(@RequestBody User user) {

        // 创建用户

    }

    @PutMapping("/{id}")

    public User updateUser(@PathVariable Long id, @RequestBody User user) {

        // 更新用户

    }

    @DeleteMapping("/{id}")

    public void deleteUser(@PathVariable Long id) {

        // 删除用户

    }

}

这段代码里头,@PathVariable 是用来从 URL 里头提取参数的,@RequestBody 是用来接收客户端传过来的 JSON 数据的。

三、Filter 是咋过滤 RESTful 请求的?

Filter 是 Java Web 开发里头的一个玩意儿,用来在请求到达 Controller 之前或者响应返回客户端之前,做一些预处理或者后处理。比如说,你可以用 Filter 来过滤掉一些不合法的请求,或者给请求加上一些额外的信息。

1. 实现一个简单的 Filter

Java Code

@Component

public class MyFilter implements Filter {

    @Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;

        String method = httpRequest.getMethod();

        if ("GET".equals(method)) {

            // 处理 GET 请求

        } else if ("POST".equals(method)) {

            // 处理 POST 请求

        }

        chain.doFilter(request, response);

    }

}

这段代码里头,doFilter 方法是 Filter 的核心方法,所有的请求都会经过这个方法。chain.doFilter 是让请求继续往下走,如果不调用这个方法,那请求就被拦截了。

2. Filter 的应用场景

Filter 可以用来干很多事儿,比如说:

  • 权限校验:看看用户有没有权限访问某个资源
  • 日志记录:记录每个请求的详细信息
  • 请求参数处理:对请求参数做一些预处理,比如说去掉空格啥的

Java Code

@Component

public class AuthFilter implements Filter {

    @Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;

        String token = httpRequest.getHeader("Authorization");

        if (token == null || !isValidToken(token)) {

            HttpServletResponse httpResponse = (HttpServletResponse) response;

            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

            return;

        }

        chain.doFilter(request, response);

    }

    private boolean isValidToken(String token) {

        // 校验 token 是否有效

        return true;

    }

}

这段代码里头,AuthFilter 是用来做权限校验的,如果请求里头没有带 Authorization 头,或者 token 无效,那就返回 401 状态码,表示未授权。

四、Spring Boot 里头的 RESTful API 设计小技巧

1. 使用 @ExceptionHandler 处理异常

RESTful API 里头,异常处理是个大事儿。Spring Boot 里头有个 @ExceptionHandler 注解,专门用来处理 Controller 里头的异常。

Java Code

@RestControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        return new ResponseEntity<>("出错了:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

    }

}

这段代码里头,@RestControllerAdvice 是用来定义一个全局的异常处理类,@ExceptionHandler 是用来处理特定类型的异常的。ResponseEntity 是用来返回 HTTP 响应的,里头可以带上状态码和响应体。

2. 使用 @Valid 做参数校验

RESTful API 里头,参数校验也是个大事儿。Spring Boot 里头有个 @Valid 注解,专门用来做参数校验。

Java Code

@PostMapping("/users")

public User createUser(@Valid @RequestBody User user) {

    // 创建用户

}

这段代码里头,@Valid 是用来校验 User 对象的,如果 User 对象里头的字段不符合要求,那就会抛出 MethodArgumentNotValidException 异常。

3. 使用 @ConfigurationProperties 做配置绑定

Spring Boot 里头有个 @ConfigurationProperties 注解,专门用来把配置文件里头的属性绑定到 Java 对象里头。

Java Code

@ConfigurationProperties(prefix = "myapp")

public class MyAppProperties {

    private String name;

    private String version;

    // getters and setters

}

这段代码里头,@ConfigurationProperties 是用来把 application.properties 里头以 myapp 开头的属性绑定到 MyAppProperties 对象里头的。

五、Spring Boot 里头的 RESTful API 设计坑点

1. 路径冲突

Spring Boot 里头,路径设计得不好,就容易出现冲突。比如说,你有两个方法,一个映射到 /users/{id},另一个映射到 /users/new,那 Spring Boot 就不知道该调用哪个方法了。

Java Code

@GetMapping("/users/{id}")

public User getUser(@PathVariable Long id) {

    // 返回某个用户

}

@GetMapping("/users/new")

public User newUser() {

    // 返回一个新用户

}

这段代码里头,/users/{id} 和 /users/new 就冲突了,因为 new 会被当成 id 来处理。

2. 跨域问题

RESTful API 里头,跨域是个常见问题。Spring Boot 里头可以用 @CrossOrigin 注解来解决跨域问题。

Java Code

@CrossOrigin(origins = "http://example.com")

@RestController

@RequestMapping("/api")

public class MyController {

    // ...

}

这段代码里头,@CrossOrigin 是用来允许 http://example.com 这个域名跨域访问的。

专有名词解释

  1. Spring MVC:Spring 框架中的一个模块,用于构建 Web 应用程序,基于 Model-View-Controller 设计模式。
  2. RESTful API:一种基于 HTTP 协议的 API 设计风格,强调资源的操作和状态转移。
  3. Controller:Spring MVC 中的一个组件,负责处理 HTTP 请求并返回响应。
  4. Filter:Java Web 开发中的一个组件,用于在请求到达 Controller 之前或响应返回客户端之前进行预处理或后处理。
  5. RestController:Spring MVC 中的一个注解,结合了 Controller 和 ResponseBody,用于返回直接写给客户端的数据。
  6. RequestMapping:Spring MVC 中的一个注解,用于映射 URL 路径到 Controller 方法。
  7. PathVariable:Spring MVC 中的一个注解,用于从 URL 路径中提取参数。
  8. RequestBody:Spring MVC 中的一个注解,用于接收客户端传过来的 JSON 数据。
  9. ExceptionHandler:Spring MVC 中的一个注解,用于处理 Controller 中的异常。
  10. Valid:Spring MVC 中的一个注解,用于做参数校验。
  11. ConfigurationProperties:Spring Boot 中的一个注解,用于将配置文件中的属性绑定到 Java 对象中。
  12. CrossOrigin:Spring Boot 中的一个注解,用于解决跨域问题。
  13. Async:Spring Boot 中的一个注解,用于让方法异步执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/898754.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/898754.shtml
英文地址,请注明出处:http://en.pswp.cn/news/898754.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享最近前端面试遇到的一些问题

前情提要&#xff08;分享个人情况&#xff0c;可以直接跳过&#xff09; 先说一下我的个人情况&#xff0c;我是2026届的&#xff0c;目前是在找前端实习。 3月初&#xff0c;从3月3日开始在Boss上投简历。 分享我的个人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 协议详细介绍

以下是关于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09; 的详细介绍&#xff0c;涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型&#xff1a;动态路由协议&#xff0c;基于距离矢量算法&#xff08…

scrapy入门(深入)

Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据&#xff0c;只需要实现少量的代码&#xff0c;就能够快速的抓取。 新建项目 (scrapy startproject xxx)&#xff1a;新建一个新的…

KiLog2MaximumIncrement的由来和KiMaximumIncrementReciprocal的由来

第一部分&#xff1a;KiLog2MaximumIncrement的由来 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…

数据结构-ArrayList

文章目录 1. 线性表2. 顺序表3. ArrayList4. ArrayList的问题以及思考4.2 增容的性能消耗问题4.3 空间浪费问题 1. 线性表 线性表&#xff08;Linear List&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见线性表&…

FastGPT 社区版快速部署指南

产品简介 FastGPT 是基于大语言模型的智能知识库系统&#xff0c;提供以下核心能力&#xff1a; ✅ 开箱即用 - 内置数据预处理、多模型对接、权限管理 ✅ 可视化编排 - 通过 Flow 工作流实现复杂问答逻辑设计 ✅ 多场景适配 - 支持客服机器人/知识检索/数据分析等场景 &…

【css酷炫效果】纯CSS实现科技感网格背景

【css酷炫效果】纯CSS实现科技感网格背景 缘创作背景html结构css样式完整代码基础版进阶版(3D光线扫描版) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;上传后更新 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&#xff0c;赶时间&a…

Android BLE 权限管理

前言 android 权限一直是比较活跃的 在蓝牙权限这一块又分新版和旧版 新版权限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT旧版权限如9.0以下 Manifest.permission.A…

vue3:十一、主页面布局(左侧菜单折叠展开设置)

一、实现效果 二、基本实现 1、菜单容器增加展开收缩方法 在菜单容器中开启这个方法&#xff0c;值设置为一个变量 :collapseiscollapse 2、定义菜单收缩与否的变量 在js中初始化是否收缩的变量&#xff0c;初始值为不收缩(也就是展开) //左侧菜单展开与收缩 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 显示设备所属的区域名称。该命令可用于查找罪魁祸首设备的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入数据并获取自动生成的主键(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代码,包含详细注释

以下是使用 JDBC 插入数据并获取自动生成的主键&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代码&#xff0c;包含详细注释&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 数据库连接参数private static final St…

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…

MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题

解决SystemUI下拉框中&#xff0c;长按WIFI图标会导致崩溃问题 文章目录 场景参考资料修改文件解决方案日志源码分析 总结 场景 在部分产品中偶发性发现&#xff0c; SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题&#xff0c;有时候是截屏、点击Home 按键后&#xff0c;长…

第三十一篇 数据仓库(DW)与商业智能(BI)架构设计与实践指南

目录 一、DW/BI架构核心理论与选型策略1.1 主流架构模式对比&#xff08;1&#xff09;Kimball维度建模架构&#xff08;2&#xff09;Inmon企业工厂架构&#xff08;3&#xff09;混合架构 二、架构设计方法论与实施步骤2.1 维度建模实战指南&#xff08;1&#xff09;模型选择…

XSS基础靶场练习

目录 1. 准备靶场 2. PASS 1. Level 1&#xff1a;无过滤 源码&#xff1a; 2. level2&#xff1a;转HTML实体 htmlspecialchars简介&#xff1a; 源码 PASS 3. level3:转HTML深入 源码&#xff1a; PASS 4. level4:过滤<> 源码&#xff1a; PASS: 5. level5:过滤on 源码…

2025年3月AI搜索发展动态与趋势分析:从技术革新到生态重构

025年3月AI搜索发展动态与趋势分析&#xff1a;从技术革新到生态重构 一、行业动态&#xff1a;巨头布局与技术升级 谷歌推出“AI模式”&#xff0c;重新定义搜索体验 谷歌上线全新“AI模式”&#xff0c;集成多模态交互与实时数据能力&#xff0c;用户可通过文本、图片或语音…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…

Qt高分屏自适应

一.设置默认 DPI 感知 Windows 上的桌面应用程序可以在不同的 DPI 感知模式下运行。 这些模式可实现不同的 DPI 缩放行为,并且可以使用不同的坐标空间。 有关 DPI 感知的详细信息,请参阅在 Windows 上开发高 DPI 桌面应用程序。 请务必显式为进程设置默认 DPI 感知模式,以避…

TPCTF 2025 web 复现

文章目录 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout 在index.js文件中&#xff0c;看到了有使用DOMPurify库来防止XSS操作 在package.json里可以看到版本是3.2.4,关于3.2.3是有绕过策略的。它会把script标签清除掉&#xff0c;去看bot可以看到flag是放…

Agent Team 多智能体系统解析

引言 在人工智能技术高速发展的今天&#xff0c;"多智能体协作系统"&#xff08;Agent Team&#xff09;正成为突破效率瓶颈的关键技术。与传统的单体AI不同&#xff0c;这种由多个专业化智能体组成的协同网络&#xff0c;通过分工协作和动态调整&#xff0c;展现出…