RESTful Web 服务详解
RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务,它利用 HTTP 协议来传输数据,支持多种数据格式如 JSON 和 XML。在 Spring 框架中,通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中,我们将介绍如何创建 RESTful 控制器,使用 @RestController 注解,处理请求和响应格式,以及处理异常的最佳实践。
创建 RESTful 控制器
RESTful 控制器用于处理 HTTP 请求并返回相应的数据。Spring 提供了一套完整的注解和工具来帮助开发者快速创建 RESTful 控制器。
使用 @RestController 注解
@RestController 注解是 Spring 提供的一个方便的注解,它结合了 @Controller 和 @ResponseBody,简化了控制器的开发。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/users")
public class UserController {@GetMappingpublic List<User> getAllUsers() {// 返回所有用户return userService.findAll();}@PostMappingpublic User createUser(@RequestBody User user) {// 创建并返回新用户return userService.save(user);}
}
在这个例子中,UserController 类使用 @RestController 注解标注,表明它是一个 RESTful 控制器。@RequestMapping 注解用于定义基础 URL 路径,@GetMapping 和 @PostMapping 分别用于处理 GET 和 POST 请求。
请求和响应格式
RESTful Web 服务常使用 JSON 和 XML 作为数据格式。Spring Boot 默认使用 Jackson 库将对象转换为 JSON 格式,也支持其他格式如 XML。
返回 JSON 格式
JSON 是 RESTful 服务中最常用的数据格式。Spring Boot 默认配置了 Jackson 作为 JSON 处理库,控制器方法返回的对象会自动转换为 JSON。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/products")
public class ProductController {@GetMappingpublic List<Product> getAllProducts() {return productService.findAll();}
}
在这个例子中,getAllProducts 方法返回一个 List<Product> 对象,Spring Boot 会自动将其转换为 JSON 格式的响应。
返回 XML 格式
要支持 XML 格式,需要在依赖中添加 Jackson XML 扩展:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
然后,在控制器方法中设置返回的媒体类型为 XML:
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/products")
public class ProductController {@GetMapping(produces = MediaType.APPLICATION_XML_VALUE)public List<Product> getAllProducts() {return productService.findAll();}
}
在这个例子中,getAllProducts 方法将返回的媒体类型设置为 XML,Spring Boot 会自动将对象转换为 XML 格式的响应。
处理异常
在 RESTful Web 服务中,处理异常是确保服务可靠性和用户体验的关键。Spring 提供了 @ExceptionHandler 和 @ControllerAdvice 注解,用于全局处理控制器中的异常。
使用 @ExceptionHandler
@ExceptionHandler 注解用于在控制器中定义特定异常的处理方法。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/orders")
public class OrderController {@GetMapping("/{id}")public Order getOrderById(@PathVariable Long id) {return orderService.findById(id).orElseThrow(() -> new OrderNotFoundException("Order not found with id " + id));}@ExceptionHandler(OrderNotFoundException.class)public ResponseEntity<String> handleOrderNotFoundException(OrderNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);}
}
在这个例子中,handleOrderNotFoundException 方法使用 @ExceptionHandler 注解处理 OrderNotFoundException 异常,并返回 404 状态码和错误消息。
使用 @ControllerAdvice
@ControllerAdvice 注解用于定义全局异常处理类,统一处理多个控制器中的异常。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(OrderNotFoundException.class)public ResponseEntity<String> handleOrderNotFoundException(OrderNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGeneralException(Exception ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}
在这个例子中,GlobalExceptionHandler 类使用 @ControllerAdvice 注解标注,定义了两个异常处理方法,分别处理 OrderNotFoundException 和其他所有异常。
总结
通过本文的讲解,我们了解了如何在 Spring 中创建 RESTful 控制器,使用 @RestController 注解,处理请求和响应格式(包括 JSON 和 XML),以及如何通过 @ExceptionHandler 和 @ControllerAdvice 进行异常处理。
相关文章:
RESTful Web 服务详解
RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务,它利用 HTTP 协议来传输数据,支持多种数据格式如 JSON 和 XML。在 Spring 框架中,通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中&…...
【ARMv8/v9 GIC 系列 5.3 -- 系统寄存器对中断的处理】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 ARMv8/v9系统寄存器对中断的控制Group 0中断的寄存器Group 1中断的寄存器安全状态与中断分组中断处理过程中断确认处理代码中断完成处理代码ARMv8/v9系统寄存器对中断的控制 在ARM GIC 体系结构中,中断分组通过一系列系统寄存器进…...
MUNIK解读ISO26262--系统架构
功能安全之系统阶段-系统架构 我们来浅析下功能安全系统阶段重要话题——“系统架构” 目录概览: 系统架构的作用系统架构类型系统架构层级的相关安全机制梳理 1.系统架构的作用 架构的思维包括抽象思维、分层思维、结构化思维和演化思维。通过将复杂系统分解…...
STM32第十五课:LCD屏幕及应用
文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间,温度,湿度。 一、LCD显示屏 液晶显示器,简称 LCD(Liquid Cry…...
Java--继承
1.继承的本质是对某一批类的抽象,从而实现对世界更好的建模 2.extends的意思是“扩展”,子类是父亲的扩展 3.Java中只有单继承,没有多继承 4.继承关系的两个类,一个为子类(派生类),一个为父类…...
Github与本地仓库建立链接、Git命令(或使用Github桌面应用)
一、Git命令(不嫌麻烦可以使用Github桌面应用) git clone [] cd [] git branch -vv #查看本地对应远程的分支对应关系 git branch -a #查看本地和远程所有分支 git checkout -b [hongyuan] #以当前的本地分支作为基础新建一个【】分支,命名为h…...
c++之旅第十一弹——顺序表
大家好啊,这里是c之旅第十一弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,数据结构…...
深入了解 PXE:定义、架构、原理、应用场景及常见命令体系
引言 PXE(Preboot Execution Environment,预启动执行环境)是一种允许计算机通过网络启动操作系统而无需本地存储设备的技术。本文将详细介绍 PXE 的定义、架构、原理、应用场景及常见命令体系,特别是以 CentOS 为例,展…...
《每天5分钟用Flask搭建一个管理系统》第9章:API设计
第9章:API设计 9.1 RESTful API的概念 RESTful API是一种基于HTTP协议的网络服务接口设计方法,它使用标准的HTTP方法,如GET、POST、PUT、DELETE等,来执行资源的操作。 9.2 Flask-RESTful扩展的使用 Flask-RESTful是一个Flask扩…...
CCM的作用及原理
CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后,就是当AWB将白色校正之后其他颜色也会跟着有明显变化,CCM的作用就是要保持白色不变,把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…...
10.09面试题目记录
艾融软件 - 线上面试题 排序算法的时间复杂度 O(n^2):冒泡,选择,插入 O(logn):折半插入排序 O(nlogn):希尔,归并,快速,堆 O(nk):桶,…...
14-29 剑和诗人3 – 利用知识图谱增强 LLM 推理能力
知识图谱提供了一种结构化的方式来表示现实世界的事实及其关系。通过将知识图谱整合到大型语言模型中,我们可以增强它们的事实知识和推理能力。让我们探索如何实现这一点。 知识图谱构建 在利用知识图谱进行语言模型增强之前,我们需要从可靠的来源构建…...
【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样
文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数(Days-in-Month Example)4 【示例2】确定保险费率(Insurance Rates Example)5 【示例3】灵活的消息格式(Flexible-Message-Format …...
深度学习 --- stanford cs231学习笔记八(训练神经网络之dropout)
6,dropout 6,1 线性分类器中的正则化 在线性分类器中,我们提到过正则化,其目的就是为了防止过度拟合。例如,当我们要用一条curve去拟合一些散点的数据时,常常是不希望训练出来的curve过所有的点,…...
【C++】 解决 C++ 语言报错:Undefined Reference
文章目录 引言 未定义引用(Undefined Reference)是 C 编程中常见的错误之一,通常在链接阶段出现。当编译器无法找到函数或变量的定义时,就会引发未定义引用错误。这种错误会阻止生成可执行文件,影响程序的正常构建。本…...
【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer
阅读时间:2023-12-20 1 介绍 年份:2022 作者:Lina M. Tran,Adam Santoro,谷歌DeepMind 期刊: Proceedings of the National Academy of Sciences 引用量:13 代码:https://github.c…...
在Spring Boot项目中引入本地JAR包的步骤和配置
在Spring Boot项目中,有时需要引入本地JAR包以便重用已有的代码库或者第三方库。本文将详细介绍如何在Spring Boot项目中引入本地JAR包的步骤和配置,并提供相应的代码示例。 1. 为什么需要本地JAR包 在开发过程中,可能会遇到以下情况需要使…...
Android Studio中使用命令行gradle查看签名信息
Android Studio中使用命令行gradle查看签名信息: 使用 Gradle 插件生成签名报告 打开 Android Studio 的 Terminal。 运行以下命令:./gradlew signingReport 将生成一个签名报告,其中包含 MD5、SHA1 和 SHA-256 的信息。 如果失败…...
昇思25天学习打卡营第5天 | 神经网络构建
1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同…...
Web缓存—Nginx和CDN应用
目录 一、代理的工作机制 二、概念 三、作用 四、常用的代理服务器 二.Nginx缓存代理服务器部署 1.在三台服务器上部署nginx 此处yum安装 2.准备测试界面 三、CDN概念及作用 1.CDN的工作过程 一、代理的工作机制 (1)代替客户机向网站请求数据…...
BilibiliDown终极指南:快速上手B站视频下载器
BilibiliDown终极指南:快速上手B站视频下载器 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibi…...
SenseVoice-small部署教程:WSL2子系统Windows本地开发环境完整搭建
SenseVoice-small部署教程:WSL2子系统Windows本地开发环境完整搭建 1. 前言:为什么要在本地部署语音识别? 如果你正在寻找一个能在自己电脑上离线运行的语音识别工具,那么你来对地方了。今天我要分享的是如何在Windows电脑上&am…...
FPGA开发避坑指南:Vivado 2023.1下MIG IP核(AXI4接口)配置DDR3的完整流程与常见错误排查
FPGA开发实战:Vivado 2023.1中MIG IP核配置DDR3的深度解析与高效排错 在FPGA开发领域,DDR3内存控制器的实现一直是工程师面临的技术挑战之一。Xilinx Vivado工具链中的Memory Interface Generator(MIG)IP核为这一难题提供了优雅的…...
边缘AI量产倒计时!Python量化工具链必须在Q3完成的4项合规认证(含ISO/IEC 23053边缘AI标准映射)
第一章:边缘AI量产临界点与Python量化工具链的战略定位边缘AI正跨越从原型验证到规模化部署的关键临界点——芯片算力持续提升、模型轻量化技术成熟、工业场景对低延迟与隐私合规的需求刚性增长,共同推动边缘AI进入“可量产”阶段。在此背景下࿰…...
Umi-OCR:开源离线OCR解决方案的全方位实践指南
Umi-OCR:开源离线OCR解决方案的全方位实践指南 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_Tren…...
如何在Python中处理大型数据集
在数据爆炸的今天,我们常常要面对动辄几十GB甚至上百GB的大型数据集。用常规Python方法处理时,内存溢出、运行缓慢的问题屡见不鲜。本文将从内存优化、高效计算、并行处理三个核心方向,分享实用的处理技巧,帮你轻松搞定大数据。&a…...
智能家庭网络系统新选择:iStoreOS打造高效家庭网络与存储中心
智能家庭网络系统新选择:iStoreOS打造高效家庭网络与存储中心 【免费下载链接】istoreos 提供一个人人会用的的路由、NAS系统 (目前活跃的分支是 istoreos-22.03) 项目地址: https://gitcode.com/gh_mirrors/is/istoreos 家庭网络卡顿…...
RHEL 8 部署 Oracle 数据库
目录 一、目标与环境 二、Oracle安装包下载 官方下载地址(推荐) 三、安装详细步骤 第一阶段:系统准备(全部以root用户操作) 1. 安装必要的依赖包 2. 创建Oracle用户和组 3. 创建目录结构并设置权限 4. 配置系统…...
深入解析IoU(Jaccard系数)在目标检测中的关键作用与高效实现
1. IoU究竟是什么?从基础概念到视觉理解 第一次接触目标检测时,我对着论文里满屏的"IoU"缩写发懵——这到底是个什么魔法指标?后来在调试YOLO模型时才发现,这个看似简单的比值,实际上是整个检测任务的基石性…...
阿里云:数据分析Agent白皮书——AI重构数据消费 2026
这份由阿里云与瓴羊发布的《数据分析 Agent 白皮书 ——AI 重构数据消费》,立足 DataAI 融合趋势,系统阐述了数据分析 Agent 的发展背景、技术架构、代表产品、行业实践、落地方法与未来方向,核心围绕AI 重构企业数据消费模式展开,…...
