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

【SpringBoot】| 接口架构风格—RESTful

目录 

一:接口架构风格—RESTful

1. 认识RESTful

2. RESTful 的注解


一:接口架构风格—RESTful

1. 认识RESTful

(1)接口

①接口: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。

②接口(API):可以指访问servlet, controller的url, 调用其他程序的函数。

(2)架构风格

指API的组织方式(长什么样子),就是一个传统的风格:http://localhost:9002/mytrans/addStudent?name=lisi&age=26

在地址上提供了 访问的资源名称addStudent, 在其后使用了get方式传递参数。

(3)REST架构风格

REST : 是一种接口的架构风格和设计的理念,不是标准。(英文: Representational State Transfer , 中文: 表现层状态转移)

①表现层状态转移:

表现层:就是视图层, 显示资源的, 例如:jsp等显示操作资源的结果。

状态: 表示资源的变化。

转移: 资源可以变化的;资源能创建(new状态)、资源创建后可以查询资源(能看到资源的内容)、资源内容可以被修改(修改后资源 和之前的不一样)。

②REST中的要素:用REST表示资源和对资源的操作

资源使用URL表示,通过名词表示资源:

在url中,使用名词表示资源, 以及访问资源的信息,在url中,使用“ / " 分隔对资源的信息,例如: http://localhost:8080/myboot/student/1001

查询资源: 通过url找到资源。

创建资源: 添加资源。

更新资源:更新资源 ,编辑。

删除资源: 去除。

使用http中的动作(请求方式), 表示对资源的操作(CURD): 

GET: 查询资源 ---> sql select

处理单个资源: 用他的单数方式

http://localhost:8080/myboot/student/1001

http://localhost:8080/myboot/student/1002

处理多个资源:使用复数形式

http://localhost:8080/myboot/students/1001/1002

POST: 创建资源 ---> sql insert

http://localhost:8080/myboot/student

在post请求中传递数据

<form action="http://localhost:8080/myboot/student" method="post">姓名:<input type="text" name="name" />年龄:<input type="text" name="age" />
</form>

PUT:更新资源 ---> sql update

浏览器不能直接支持put,所以先成post;然后使用一个隐藏域,把post请求变成真实的put

<form action="http://localhost:8080/myboot/student/1" method="post">姓名:<input type="text" name="name" />年龄:<input type="text" name="age" /><input type="hidden" name="_method" value="PUT" />
</form>

DELETE: 删除资源 ---> sql delete

<a href="http://localhost:8080/myboot/student/1">删除1的数据</a>

总结:使用url表示资源 ,使用http动作操作资源!

(4)分页

如果需要分页、排序等参数,依然是通过?的形式放在url的后面, 例如:

http://localhost:8080/myboot/students?page=1&pageSize=20

(5)优点

①轻量:直接基于 http,不再需要任何别的诸如消息协议。

②面向资源:一目了然,具有自解释性。

③数据描述简单:一般以 xml,json做数据交换。

④无状态:在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态, 极大的降低了复杂度。

⑤简单、低耦合

2. RESTful 的注解

@PathVariable用来获取url中的数据;该注解是实现RESTFul最主要的一个注解!

@GetMapping接收get方式的请求;等同于@RequestMapping( method=RequestMethod.GET)。

@PostMapping接收和处理Post方式的请求;等同于@RequestMapping( method=RequestMethod.POST) 。

@PutMapping接收put方式的请求;等同于 @RequestMapping( method=RequestMethod.PUT)。

@DeleteMapping接收delete方式的请求;等同于 @RequestMapping( method=RequestMethod.DELETE)。

@RestController复合注解, 是@Controller@ResponseBody组合;在类的上面使用@RestController , 表示当前类者的所有方法都加入了 @ResponseBody。

案例:@PathVariable注解和@GetMapping注解的联合使用(查询资源)

①在类上使用@RestController复合注解,作用时把当前类交给Spring容器管理,并且在该类下面的每个方法都默认加上@ResponseBody。

②使用GetMapping注解发送get请求,我们知道Restful风格的请求路径中是没有变量的,所以要先使用{变量名}定义路径变量,在使用路径变量@PathVariable注解引用路径变量;例如:queryStudent(@PathVariable(value = "stuId") Integer stuId),表示把路径变量传过来的值赋给stuId变量。

package com.zl.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyRestController {@GetMapping("/student/{stuId}")public String queryStudent(@PathVariable(value = "stuId") Integer stuId){return "Studnet的id是:"+stuId;}
}

执行结果:

根据url传过来的值,赋值给路径变量,路径变量在通过@PathVariable注解让我们拿到数据,进行展示。

案例:@PathVariable注解和@PostMapping注解的联合使用(创建资源)

addStudent.html表单页面(属于静态资源放到static目录下),在post请求中传递数据

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>添加学生</h3><form action="student/zhangsan/18" method="post"><input type="submit" value="注册学生"></form>
</body>
</html>

接收数据

    // 创建资源@PostMapping("/student/{name}/{age}")public String createStudent(@PathVariable("name") String name,@PathVariable("age") Integer age){return "创建资源Student"+name+"="+age;}

执行结果:

案例:对于Post、Put、Delete都需要编写一个表单页面,比较麻烦,并且对于put和delete请求浏览器是不支持的;可以借助一个Postman工具

注:当路径变量名和形参名保持一致,@PathVariable中的value可以省略。

Postman测试工具:可以测试 get ,post , put ,delete 等请求

    // 更新资源@PutMapping("/student/{id}/{age}")public String modifyStudent(@PathVariable Integer id,@PathVariable Integer age){return "更新资源Student:"+id+"="+age;}// 删除资源@DeleteMapping("/student/{id}")public String removeStudentById(@PathVariable Integer id){return "删除资源Student:"+id;}

执行结果:省去写表单页面了

案例:使用HiddenHttpMethodFilter过滤器,将post请求转为put ,delete

在SpringMVC中 有一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter。

作用: 把请求中的post请求转为 put , delete。

第一步:在application.properties(yml) : 开启使用HiddenHttpMethodFilter过滤器

源码分析发现在SpringBoot中默认是把这个组件已经配置好的,但是默认是关闭的,要想生效必须手动设置生效。

package org.springframework.boot.autoconfigure.web.servlet;public class WebMvcAutoConfiguration {@Bean@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled")public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {return new OrderedHiddenHttpMethodFilter();}
}

设置为true

#启用过滤器
spring.mvc.hiddenmethod.filter.enabled=true

第二步:在请求页面中,发出post请求;type类型使用隐藏域hidden,name参数是 _method, value对应着我们真正的请求方式put、delete

form表单页面,实际上真正发出的是put请求!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="student/test" method="post" ><!--指定真正的请求方式--><input type="hidden" name="_method" value="put"><input type="submit" value="测试" /></form>
</body>
</html>

扩展:当前也可以把_method参数设置为自定义参数

通过前面的源码分析,如果没有自定义HiddenHttpMethodFilter,容器会帮我们自定义一个纳入容器管理,此时使用的默认参数就是_method!

所以就可以自己创建一个HiddenHttpMethodFilter,调用setMethodParam方法自己定义

package com.zl.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.HiddenHttpMethodFilter;@Configuration(proxyBeanMethods = false)
public class MyConfig {// 自定义Filter,纳入容器管理@Beanpublic HiddenHttpMethodFilter hiddenHttpMethodFilter(){HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();// 设置method参数为_mmethodFilter.setMethodParam("_m");return methodFilter;}}

问题:请求路径冲突

例如:以下两个请求,使用get请求,资源名也相同,携带的数据类型也相同;我们直接进行访问:http://localhost:8081/student/1;此时就会有路径冲突,导致访问失败!

解决:设计路径,必须唯一, 路径uri和请求方式必须唯一!

@GetMapping("/student/{id}") 
@GetMapping("/student/{age}")

相关文章:

【SpringBoot】| 接口架构风格—RESTful

目录 一&#xff1a;接口架构风格—RESTful 1. 认识RESTful 2. RESTful 的注解 一&#xff1a;接口架构风格—RESTful 1. 认识RESTful &#xff08;1&#xff09;接口 ①接口&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&…...

CentOS系统环境搭建(十)——CentOS7定时任务

centos系统环境搭建专栏&#x1f517;点击跳转 使用CentOS系统环境搭建&#xff08;九&#xff09;——centos系统下使用docker部署项目的项目做定时任务。 CentOS7定时任务 查看现有的定时任务 crontab -l编辑定时任务 crontab -e示例 每天凌晨两点运行脚本 清理内存 0 2 *…...

如何在安卓设备上安装并使用 ONLYOFFICE 文档

您可以使用文档安卓版应用&#xff0c;在移动设备上访问存在您 ONLYOFFICE 帐号中的文件。阅读本文&#xff0c;了解如何操作。 什么是 ONLYOFFICE 文档安卓版 适用于 Android 系统的 ONLYOFFICE 文档是一款全面的办公工具&#xff0c;您可以使用它&#xff0c;查看、创建、编…...

【制作npm包1】申请npm账号、认识个人包和组织包

概述 在开发当中经常有一种现象&#xff0c;重复代码写了N多遍&#xff0c;再次写同样的逻辑就再次翻查以前的代码逻辑。效率低下且容易出错&#xff0c;封装一个npm包的价值也不仅仅是给别人用&#xff0c;封装一套属于自己或者本部门的npm包也是相当有必要。 也许经常看到一…...

linux学习(文件描述符)[11]

一切皆文件 用代码创建的文件&#xff0c;默认路径在可执行文件同级目录下&#xff08;本质是进程通过系统接口创建的&#xff09; 文件宏 在Linux下&#xff0c;有一些与文件操作相关的宏可以用于处理文件描述符和文件权限。以下是一些常用的文件宏&#xff1a; STDIN_FIL…...

影响力再度提升,Smartbi多次蝉联Gartner、IDC等权威认可

近期&#xff0c;思迈特软件捷报频传&#xff0c;Smartbi凭借技术创新实力和产品能力&#xff0c;成功入选Gartner中国增强数据分析代表厂商及自助分析代表厂商&#xff0c;同时&#xff0c;连续三年蝉联“IDC中国FinTech 50”榜单。 Part.1 再次被Gartner提名 Smartbi深度融…...

【动态map】牛客挑战赛67 B

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 考虑动态的map 可以先定义一个状态&#xff0c;然后用map统计前缀这个状态的出现次数 在这里&#xff0c;定义{a,b}为cnt1 - cnt0和cnt2 - cnt0 当cnt0 和 cnt1都和cnt2相同时&#xff0c;统计贡献…...

mysql(2)

1.ACID 关系型数据库都有ACID特性 原子性&#xff08;Atomicity&#xff09; &#xff1a; 事务是最小的执行单位&#xff0c;不允许分割。事务的原子性确保动作要么全部完成&#xff0c;要么完全不起作用&#xff1b;一致性&#xff08;Consistency&#xff09;&#xff1a;…...

介绍 Apache Spark 的基本概念和在大数据分析中的应用

Apache Spark是一种基于内存计算的大数据处理框架&#xff0c;它支持分布式计算&#xff0c;并且能够处理比传统处理框架更大量的数据。以下是Apache Spark的一些基本概念和在大数据分析中的应用&#xff1a; RDD (Resilient Distributed Dataset)&#xff1a;RDD是Spark的核心…...

Vue CLI创建Vue项目详细步骤

&#x1f680; 一、安装Node环境&#xff08;建议使用LTS版本&#xff09; 在开始之前&#xff0c;请确保您已经安装了Node.js环境。您可以从Node.js官方网站下载LTS版本&#xff0c;以确保稳定性和兼容性。 中文官网下载 确认已安装 Node.js。可以在终端中运行 node -v 命令…...

机器学习算法之-逻辑回归(2)

为什么需要逻辑回归 拟合效果太好 特征与标签之间的线性关系极强的数据&#xff0c;比如金融领域中的 信用卡欺诈&#xff0c;评分卡制作&#xff0c;电商中的营销预测等等相关的数据&#xff0c;都是逻辑回归的强项。虽然现在有了梯度提升树GDBT&#xff0c;比逻辑回归效果更…...

【业务功能篇65】maven加速 配置settings.xml文件 镜像

maven加速 添加阿里镜像仓 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additi…...

题目:售货员的难题(状压dp)

售货员的难题 题目描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a; 思路AC代码&#xff1a; 题目描述 某乡有n个村庄( 1 < n < 16 )&#xff0c;有一个售货员&#xff0c;他要到各个村庄去售货&am…...

Linux 的 MySQL 5.x - 关于 Windows 10 的 Navicat Premium 导入 Excel (.xlsx)文件,报错问题集锦

问题 [ERR] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:01’ for column ‘xxx_time’ 解决方法&#xff1a; Windows 则是 my.ini Linux 系统则是 /etc/my.cnf 修改my.ini配置文件&#xff0c;建议修改前新备份下&#xff0c; my.ini中查找sql-mode&#xff0…...

基于IP网络的存储协议——iSCSI

文章首发地址 iSCSI&#xff08;Internet Small Computer System Interface&#xff09;是一种基于IP网络的存储协议&#xff0c;它能够在TCP/IP网络上实现SCSI协议&#xff0c;使得不同的主机可以通过网络共享存储设备。iSCSI可以将存储设备映射到本地主机上&#xff0c;使得主…...

神经网络基础-神经网络补充概念-27-深层网络中的前向传播

概念 深层神经网络中的前向传播是指从输入数据开始&#xff0c;逐层计算每个神经元的输出值&#xff0c;直到得到最终的预测值。 一般步骤 1输入数据传递&#xff1a; 将输入数据传递给网络的输入层。输入数据通常是一个特征矩阵&#xff0c;每一列代表一个样本&#xff0c;…...

用cpolar生成的公网地址,对位于本地的Cloudreve网盘进行访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…...

docker compose部署zookeeper

单机部署 新建docker-compose.yaml version: 3 services:zookeeper:image: zookeeper:3.5.7container_name: base-zookeeperhostname: zookeeperprivileged: truerestart: alwaysports:- 2181:2181environment:TZ: "Asia/Shanghai"volumes:- ./volumes/zookeeper/d…...

【SA8295P 源码分析】77 - QNX Camera 之 ais_server 服务 源码分析

【SA8295P 源码分析】77 - QNX Camera 之 ais_server 服务 源码分析 一、QNX 侧 AIS 摄像头服务启动命令1.1 ais_server:在 ifs_camera.img 中启动1.2 ais_be_server:在 startup.sh 中启动二、ais_server 源码分析2.1 ais_server 编译脚本分析2.2 ais_server.c:监听 ais_cli…...

内网搭建电影网站的实现和进行公网访问

如何实现内网搭建电影网站并进行公网访问 文章目录 如何实现内网搭建电影网站并进行公网访问前言1. 把软件分别安装到本地电脑上1.1 打开PHPStudy软件&#xff0c;安装一系列电影网站所需的支持软件1.2 设置MacCNS10的运行环境1.3 进入电影网页的安装程序1.4 对运行环境进行检测…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...