构建强大的RESTful API:@RestController与@Controller的对比与应用
构建强大的RESTful API:@RestController与@Controller的对比与应用
- 前言
- 什么是RESTful API
- @RestController,@Controller,@ResponseBody
- 1. `@Controller`注解:
- 2. `@RestController`注解:
- 3. `@ResponseBody`注解:
- 示例
- 非thymeleaf示例实现
- thymeleaf示例实现
前言
你是否曾想过,当您在浏览网页或调用API时,后台是如何处理请求并生成响应的?这就是Spring MVC的任务。在这篇博客中,我们将带您进入Spring MVC的精彩世界,深入探讨
@RestController
、@Controller
和@ResponseBody
注解的工作原理和用法。无论您是初学者还是有经验的开发者,本文都将为您提供清晰的指南,以帮助您构建强大的Web应用程序和RESTful API。
什么是RESTful API
RESTful API(Representational State Transfer API)是一种基于REST架构风格的应用程序接口。它是一种设计理念,旨在使网络应用程序更加简单、可伸缩和易于理解。RESTful API 的核心思想是将资源(Resource)作为核心概念,并通过标准的HTTP方法来对资源进行操作。
以下是关于RESTful API的主要特点和概念:
-
资源(Resource):在RESTful API中,一切皆资源。资源可以是实际的数据对象,也可以是虚拟的概念,如用户、产品、订单等。每个资源都有一个唯一的标识符(通常是URL)。
-
HTTP方法:RESTful API 使用标准的HTTP方法来执行操作。最常用的HTTP方法包括:
- GET:用于检索资源的信息。
- POST:用于创建新资源。
- PUT:用于更新现有资源。
- DELETE:用于删除资源。
-
状态无关性(Statelessness):RESTful API是无状态的,每个请求都包含了足够的信息以便服务器能够理解并处理请求,而不依赖于之前的请求状态。这使得API设计更加简单和可伸缩。
-
URL作为资源标识符:每个资源都由一个唯一的URL标识符来表示。通过URL,客户端可以访问和操作资源。
-
使用HTTP状态码:HTTP状态码用于指示请求的成功或失败以及失败的原因。常见的状态码包括200(成功)、201(已创建)、404(未找到)、500(服务器错误)等。
-
数据格式:RESTful API通常使用JSON或XML等标准数据格式来传递数据。这些格式易于解析和生成,同时具有良好的可读性。
-
无需保存状态(Stateless):RESTful API不需要在服务器端保存客户端的状态信息。每个请求都应包含足够的信息,以便服务器可以理解和处理请求。
-
可伸缩性:由于RESTful API的无状态性和资源导向性,它们通常具有良好的可伸缩性,可以应对高负载和大规模使用。
-
安全性:RESTful API可以使用标准的HTTP安全机制(如HTTPS)来保护通信,同时可以使用认证和授权机制来限制访问资源的权限。
总之,RESTful API是一种使用HTTP协议和REST原则来设计和构建的API。它的目标是使Web服务更加简单、易于理解和可伸缩。由于其广泛的采用和标准化,RESTful API已成为构建现代Web应用程序和移动应用程序的常见方式。
@RestController,@Controller,@ResponseBody
@RestController,@Controller和@ResponseBody是Spring框架中常用的注解,用于构建RESTful Web应用程序。下面详细说明它们的用法和含义:
1. @Controller
注解:
- 含义:
@Controller
注解用于标识一个类是Spring MVC中的控制器。控制器负责处理客户端的请求,并根据请求的信息来调用相应的方法来处理请求和生成响应。 - 使用方法:您需要将这个注解放在一个类的前面,以表明这个类是一个控制器。通常,您还需要在方法级别使用其他注解来指定哪些方法用于处理特定的请求。
2. @RestController
注解:
- 含义:
@RestController
注解是@Controller
的一个特化版本,它结合了@Controller
和@ResponseBody
的功能。它表示这个类的每个方法都会返回一个对象,而不是一个视图,这些对象会被自动序列化为JSON或XML,然后发送给客户端。 - 使用方法:与
@Controller
类似,您需要将这个注解放在一个类的前面,以表明这个类是一个REST控制器。然后,您可以在方法级别使用@RequestMapping
等注解来指定处理不同HTTP请求的方法。
3. @ResponseBody
注解:
- 含义:
@ResponseBody
注解用于指示一个方法的返回值应该被直接写入HTTP响应体中,而不是解析为视图。这通常用于返回JSON、XML或其他数据格式的响应。 - 使用方法:您可以将
@ResponseBody
注解放在一个方法的前面,以表明这个方法的返回值将直接作为HTTP响应的内容。通常,您需要在方法上使用@RequestMapping
等注解来指定请求的URL和HTTP方法。
示例
非thymeleaf示例实现
下面是一个示例,演示了如何在Spring控制器中使用这些注解:
@RestController
@RequestMapping("/api")
public class MyRestController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}@PostMapping("/add")public ResponseEntity<String> addData(@RequestBody DataObject data) {// 处理请求并返回响应return ResponseEntity.ok("Data added successfully");}
}
在上面的示例中,@RestController
注解表明MyRestController
是一个REST控制器,@GetMapping
和@PostMapping
注解指定了不同的HTTP请求处理方法,而@ResponseBody
注解用于返回直接写入HTTP响应体的数据。同时,@RequestMapping
注解定义了URL映射路径。
thymeleaf示例实现
现在,让我们结合Thymeleaf创建一个示例:
首先,确保您的项目中配置了Thymeleaf模板引擎。然后,创建一个Spring MVC控制器,如下所示:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class MyController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Hello, World!");return "hello"; // 这里返回的是Thymeleaf模板的名称}
}
在上面的示例中,@Controller
注解标识MyController
类为控制器,@GetMapping("/hello")
注解映射了/hello
路径的GET请求。在sayHello
方法中,我们使用了Model
对象来传递数据到视图。
接下来,创建一个Thymeleaf模板,假设模板文件名为hello.html
,并放置在适当的模板目录中:
<!DOCTYPE html>
<html>
<head><title>Hello Page</title>
</head>
<body><h1 th:text="${message}"></h1>
</body>
</html>
在这个模板中,我们使用Thymeleaf的语法来渲染从控制器传递过来的消息。
最后,确保您的Spring配置正确,包括Thymeleaf的模板解析器配置。这样,当用户访问/hello
路径时,Spring MVC将调用sayHello
方法,渲染Thymeleaf模板,并将消息传递到模板中。
这个示例演示了如何结合Spring MVC的注解和Thymeleaf模板引擎来创建一个简单的Web应用程序。确保根据您的项目需要进行配置和扩展。
相关文章:
构建强大的RESTful API:@RestController与@Controller的对比与应用
构建强大的RESTful API:RestController与Controller的对比与应用 前言什么是RESTful APIRestController,Controller,ResponseBody1. Controller注解:2. RestController注解:3. ResponseBody注解: 示例非thy…...
【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时
第十章,评估(下)-当不存在一个简单的正确答案时 在上一章中,了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出,我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。 然而,如果 LLM …...
【微服务的集成测试】python实现-附ChatGPT解析
1.题目 微服务的集成测试 知识点:深搜 时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 现在有n个容器服务,服务的启动可能有一定的依赖性 (有些服务启动没有依赖)其次服务自身启动加载会消耗一些时间。 给你一个 nxn 的二维矩阵 useTime,其中 useTime[i][i]=10 表示…...

Mesa新版来袭
Mesa 17.1.6 发布了,Mesa 是一个三维(3D)图形库的开源集合,其主要目标是在 Linux / UNIX 操作系统下实现各种 API(应用程序编程接口)和 OpenGL 规范。 它面向 3D 计算机图形,硬件加速 3D 渲染和…...

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient
1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始,Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的,并推荐使用新的 Java API Client,即 ElasticsearchClient. 为什么要将 RestHighLevelC…...
辅助驾驶功能开发-功能对标篇(15)-NOA领航辅助系统-吉利
1.横向对标参数 厂商吉利车型FX11/EX11/DCY11/G636上市时间2022Q4方案6V5R+1DMS摄像头前视摄像头1*(8M)侧视摄像头/后视摄像头1环视摄像头4DMS摄像头1雷达毫米波雷达54D毫米波雷达/超声波雷达12激光雷达/域控供应商福瑞泰克辅助驾驶软件供应商福瑞泰克高精度地图百度芯片TDA4 T…...

javascript: Sorting Algorithms
// Sorting Algorithms int JavaScript https://www.geeksforgeeks.org/sorting-algorithms/ /** * file Sort.js * 1. Bubble Sort冒泡排序法 * param arry * param nszie */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i)…...

嵌入式Linux应用开发-驱动大全-同步与互斥④
嵌入式Linux应用开发-驱动大全-同步与互斥④ 第一章 同步与互斥④1.5 自旋锁spinlock的实现1.5.1 自旋锁的内核结构体1.5.2 spinlock在UP系统中的实现1.5.3 spinlock在SMP系统中的实现 1.6 信号量semaphore的实现1.6.1 semaphore的内核结构体1.6.2 down函数的实现1.6.3 up函数的…...

2023年【高压电工】证考试及高压电工复审模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 高压电工证考试根据新高压电工考试大纲要求,安全生产模拟考试一点通将高压电工模拟考试试题进行汇编,组成一套高压电工全真模拟考试试题,学员可通过高压电工复审模拟考试全真模拟&a…...

C/C++学习 -- 分组密算法(3DES算法)
1. 3DES算法概述 3DES(Triple Data Encryption Standard),又称为TDEA(Triple Data Encryption Algorithm),是一种对称加密算法,是DES(Data Encryption Standard)的加强版…...
C/C++面试题总结
1.new与malloc的区别 new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。 使用new操作符申请内存分配时无须指定内存块的大小,而malloc则需要显式地指出所需内存的尺寸。 int *p new int; delete p;//一定要配对使用n…...

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘
就是我在反序列化时,遇到这样一个警告: Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查,有些人说用SuppressWarnings(“unchecked”)去忽略警告,但是我觉得作为一名合格的程序…...

图像处理与计算机视觉--第四章-图像滤波与增强-第二部分
目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急,不然往往事倍功半! 2.静下心来,理解每一个…...
[前端基础]typescript安装以及类型拓展
(0)写在前面: 作者之前都是在写js,所以这里介绍ts肯定是不能从头开始介绍了,主要在js的基础上介绍ts关于类型的几个特性,以及ts的安装还有配置问题 (1)ts和js是什么关系 通俗点来…...
网络参考资料汇总(1)
将这段时间参考的各路大佬的资料加以汇总分类: (1)FFmpeg: 基于FFmpeg进行rtsp推流及拉流(详细教程) Linux 编译安装 FFmpeg 步骤(带ffplay) Jetson 环境安装(三):jetson nano配置ffmpeg和ngin…...
Remove和RemoveLast用法
LeetCode 46 全排列 先贴代码 class Solution {List<List<Integer>> result new ArrayList<>();List<Integer> temp new ArrayList<>();public List<List<Integer>> permute(int[] nums) {dfs(nums, 0);return result;}public v…...

(一) 使用 Hugo 搭建个人博客保姆级教程(上篇)
手把手教你如何从0开始构建一个静态网站,这不需要有太多的编程和开发经验和时间投入,也基本不需要多少成本(除了个性化域名),使用GitHub和Hugo模板即可快速构建和上线一个网站。 目标读者 本文档适用于以下用户&…...

数据结构之栈
栈的模拟实现 1.栈的概念2.栈的方法3.栈的模拟实现(代码)3.1 接口My_Stack3.2 StackList3.3 异常类StackException3.4 测试类Test 1.栈的概念 2.栈的方法 3.栈的模拟实现(代码) 3.1 接口My_Stack 3.2 StackList 3.3 异常类StackException 3.4 测试类Test...

wireshark of tshark tools v3.4.0版本 支持json
tshark(1) Install tshark (Wireshark) Ver.3.4.0 on CentOS7 --It must be "ps", "text", "pdml", "psml" or "fields". TCP 协议中的三次握手和四次挥手是 TCP 连接建立和关闭的过程。 三次握手 客户端向服务器发送 SYN…...

Python开源项目月排行 2023年9月
#2023年9月2023年9月9日1fishdraw这个项目是用来随机生成一条鱼的,这条鱼特别的稀奇古怪,这个项目不依赖任何库,支持 svg, json, csv 等格式。2vizro一个用于创建模块化数据可视化应用程序的工具包。在几分钟内快速自助组装定制仪表板 - 无需…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...