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

构建强大的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的主要特点和概念:

  1. 资源(Resource):在RESTful API中,一切皆资源。资源可以是实际的数据对象,也可以是虚拟的概念,如用户、产品、订单等。每个资源都有一个唯一的标识符(通常是URL)。

  2. HTTP方法:RESTful API 使用标准的HTTP方法来执行操作。最常用的HTTP方法包括:

    • GET:用于检索资源的信息。
    • POST:用于创建新资源。
    • PUT:用于更新现有资源。
    • DELETE:用于删除资源。
  3. 状态无关性(Statelessness):RESTful API是无状态的,每个请求都包含了足够的信息以便服务器能够理解并处理请求,而不依赖于之前的请求状态。这使得API设计更加简单和可伸缩。

  4. URL作为资源标识符:每个资源都由一个唯一的URL标识符来表示。通过URL,客户端可以访问和操作资源。

  5. 使用HTTP状态码:HTTP状态码用于指示请求的成功或失败以及失败的原因。常见的状态码包括200(成功)、201(已创建)、404(未找到)、500(服务器错误)等。

  6. 数据格式:RESTful API通常使用JSON或XML等标准数据格式来传递数据。这些格式易于解析和生成,同时具有良好的可读性。

  7. 无需保存状态(Stateless):RESTful API不需要在服务器端保存客户端的状态信息。每个请求都应包含足够的信息,以便服务器可以理解和处理请求。

  8. 可伸缩性:由于RESTful API的无状态性和资源导向性,它们通常具有良好的可伸缩性,可以应对高负载和大规模使用。

  9. 安全性: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&#xff1a;RestController与Controller的对比与应用 前言什么是RESTful APIRestController&#xff0c;Controller&#xff0c;ResponseBody1. Controller注解&#xff1a;2. RestController注解&#xff1a;3. ResponseBody注解&#xff1a; 示例非thy…...

【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时

第十章&#xff0c;评估&#xff08;下&#xff09;-当不存在一个简单的正确答案时 在上一章中&#xff0c;了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出&#xff0c;我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。 然而&#xff0c;如果 LLM …...

【微服务的集成测试】python实现-附ChatGPT解析

1.题目 微服务的集成测试 知识点:深搜 时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 现在有n个容器服务,服务的启动可能有一定的依赖性 (有些服务启动没有依赖)其次服务自身启动加载会消耗一些时间。 给你一个 nxn 的二维矩阵 useTime,其中 useTime[i][i]=10 表示…...

Mesa新版来袭

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

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始&#xff0c;Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的&#xff0c;并推荐使用新的 Java API Client&#xff0c;即 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年【高压电工】证考试及高压电工复审模拟考试

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

C/C++学习 -- 分组密算法(3DES算法)

1. 3DES算法概述 3DES&#xff08;Triple Data Encryption Standard&#xff09;&#xff0c;又称为TDEA&#xff08;Triple Data Encryption Algorithm&#xff09;&#xff0c;是一种对称加密算法&#xff0c;是DES&#xff08;Data Encryption Standard&#xff09;的加强版…...

C/C++面试题总结

1.new与malloc的区别 new操作符从自由存储区上为对象动态分配内存空间&#xff0c;而malloc函数从堆上动态分配内存。 使用new操作符申请内存分配时无须指定内存块的大小&#xff0c;而malloc则需要显式地指出所需内存的尺寸。 int *p new int; delete p;//一定要配对使用n…...

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

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

图像处理与计算机视觉--第四章-图像滤波与增强-第二部分

目录 1.图像噪声化处理与卷积平滑 2.图像傅里叶快速变换处理 3.图像腐蚀和膨胀处理 4 图像灰度调整处理 5.图像抖动处理算法 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急&#xff0c;不然往往事倍功半&#xff01; 2.静下心来&#xff0c;理解每一个…...

[前端基础]typescript安装以及类型拓展

&#xff08;0&#xff09;写在前面&#xff1a; 作者之前都是在写js&#xff0c;所以这里介绍ts肯定是不能从头开始介绍了&#xff0c;主要在js的基础上介绍ts关于类型的几个特性&#xff0c;以及ts的安装还有配置问题 &#xff08;1&#xff09;ts和js是什么关系 通俗点来…...

网络参考资料汇总(1)

将这段时间参考的各路大佬的资料加以汇总分类&#xff1a; &#xff08;1&#xff09;FFmpeg: 基于FFmpeg进行rtsp推流及拉流&#xff08;详细教程&#xff09; Linux 编译安装 FFmpeg 步骤&#xff08;带ffplay&#xff09; 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开始构建一个静态网站&#xff0c;这不需要有太多的编程和开发经验和时间投入&#xff0c;也基本不需要多少成本&#xff08;除了个性化域名&#xff09;&#xff0c;使用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这个项目是用来随机生成一条鱼的&#xff0c;这条鱼特别的稀奇古怪&#xff0c;这个项目不依赖任何库&#xff0c;支持 svg, json, csv 等格式。2vizro一个用于创建模块化数据可视化应用程序的工具包。在几分钟内快速自助组装定制仪表板 - 无需…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...