实战 - Restful APi 格式规范
文章目录
- 1. 特征
- 2. 优点
- 3. 动作
- 1. GET 获取资源
- 2. POST 创建资源
- 3. PUT 整体替换
- 4. PATCH 部分替换
- 5. DELETE 删除资源
- 4. 示例
RESTful是一种API的设计风格,他和GraphQL ,JSON-RPC,WebService类似,用于定义在CS、BS架构下暴露服务端接口。此次设计对接规范,将使用RESTful作为标准。
1. 特征
RESTful风格的特点是:
① URI资源化:
即,URI代表的是资源,而不包含动作。比如,一个班级,有很多学生,我们可以这样表示:/class/students
② 动作由HTTP头里的方法决定:
比如,我们想新增一个学生,我们可以用POST方法:
POST /class/students
{"name": "Jake","age" : 18
}
我们想查看当前有哪些学生,可以用GET方法:
GET /class/students
我们想查看某学生的具体信息,可以用路径指定到某一个ID:
GET /class/students/1
我们想要开除id为1的学生,可以用DELETE方法:
DELETE /class/students/1
HTTP头里面的方法决定了动作后,后端实现也应该严格根据动作来,比如,GET请求不应该对数据造成任何更改,如此,我们对权限控制便非常方便,例如,如果是访客,我们可以只开放GET方法,而对于ADMIN,我们可以开放GET,POST,DELETE等方法。
大多数就是做CRUD,用HTTP头部动作,可以很好满足。
③ 资源的表现由Content-Type决定:
HTTP请求的头信息中Accept和Content-Type字段,是对资源的表现描述。例如,指定是JSON格式,还是HTML格式。
④ 无状态:
无状态是指客户端无状态,例如,你不应该在客户端使用类似的逻辑:
if (hasStudent("Jake")) {getStudentInfo("Jake");
}
因为,hasStudent和getStudentInfo调用之间,可能别人已经将Jake删除了,你的状态维护不一定准确。 你可以直接getStudentInfo(“Jake”),没有则返回失败即可。 服务端可以维护一些状态,但最好不要维护太多,例如,HTTP登录状态,是应该维护的,但是,记录并强制要求用户A是否请求过某个URL再请求另一个URL,这种设计就不应该了。
⑤ 数据安全:
使用HTTPS协议,加密数据。
我们对接统一采用RESTful方式的HTTPS(为了加密)请求,内容为JSON格式,其中,安全、幂等性、无状态之类的约束,请产品线严格按照Restful规定设计。
2. 优点
① 减少沟通成本:
API是开放给别人使用的,由于有既有的约定,会让沟通成本大大减少,这是API提供者最应该考虑的。
② 能够接纳多种客户端(适用于大多数CS BS架构程序):
不止是web程序,基本上的CS架构程序,都可以使用RESTful提供API,这样,不论是WEB Client还是Windows APP还是,Mobile APP,都可以轻松使用服务端的API。
③ 思维方式转换为以资源为中心:
传统的方式是以操作为中心,例如create_user, query_students。
类似于面向对象以对象为中心,RESTful推崇以资源为中心,说不上绝对好,但的确会引导大家考虑资源本身,关注内聚性,关注权限,关注资源间关联。
④ 扩展方便:
无状态设计对横向扩展非常方便,因为API之间解耦比较好,资源解耦也比较好。 还有一个叫 hypertext-driven 的东西,类似于自描述,但是用起来也不方便,在CodeReview工具提供的API便是这种方式,优点是服务端可以随意更换URL,缺点是请求前要去查询一下该请求什么路径。例如github的参考https://api.github.com/
⑤ 建立在HTTP协议基础之上:
HTTP协议里面规定的东西很多,例如,缓存,压缩,代理,加密,穿透,等等,都已经让HTTP帮忙完成了,给很多实现减负。
3. 动作
1. GET 获取资源
举例:获取学生Jake的信息。
GET /class/students?name="Jake"
2. POST 创建资源
创建资源,不会指定资源ID,但创建完成后,通常会返回资源的ID,这样后续可以通过资源ID操作此资源。
举例:创建学生。
POST /class/students
{"name": "Jake", "age" : 18, "score": 0}
3. PUT 整体替换
为了定位资源,要求路径上有资源的唯一ID。
举例:替换ID为2的学生的信息为如下新信息。
PUT /class/students/2
{"name": "Jim","age": 19}# 此操作将原本ID为2的学生的所有属性冲掉了,替换后,ID为2的学生整体内部数据结构变为:
{"id": 2, "name": "Jim","age": 19}
异常:
① 如果Playload为空,返回失败。
② 如果Playload为{},是正确的,表示清空(重置),例如上述示例内部数据结构将变为:{“id”: 2}
4. PATCH 部分替换
为了定位资源,要求路径上有资源的唯一ID。
举例:更新ID为2的学生的年龄从之前的18岁更新为20岁。
PATCH /class/students/2
{"age": 20}# 这里,ID为2的学生的其他属性保留,整体内部数据结构变成:
{"id": 2, "name": "Jake", "age" : 20, "score": 0}
异常:
① 如果Playload为空或{},返回失败。
② 对于嵌套的结构,如果是正常书写,表示整体替换;如果是点分结构,表示部分更新。
比如:
{"id": 2, "name": "Jake", "age" : 20, "score": {"English": 86, "Chinese":88, "math":99}}
子结构更新:
PATCH /class/students/2
{"score": {"math":100}}# 替换后为:
{"id": 2, "name": "Jake", "age" : 20, "score": {"math":100}}
子结构更新:
PATCH /class/students/2
{"score.math": 100}# 替换后为:
{"id": 2, "name": "Jake", "age" : 20, "score": {"English": 86, "Chinese":88, "math":100}}
③ 对于数组,标准用法是表示整体替换,而不能增删。
比如:
{"id": 2, "name":"Jake", "friends": ["Jim", "Marry", "Jake"]}
执行整体替换:
PATCH /class/students/2
{"friends": ["Bob"]}# 替换后为:
{"id": 2, "name":"Jake", "friends": ["Bob"]}
为了支持增加和删除功能,我们在URL参数上,附带_arrayop=[add,remove],用于表示增删数组。
例如:
{"id": 2, "name":"Jake", "friends": ["Jim", "Marry", "Jake"]}
PATCH /class/students/2?_arrayop=add
{"friends": ["Bob"]}# 增加后为:
{"id": 2, "name":"Jake", "friends": ["Jim", "Marry", "Jake", "Bob"]}
PATCH /class/students/2?_arrayop=remove
{"friends": ["Jim"]}# 删除后为:
{"id": 2, "name":"Jake", "friends": ["Marry", "Jake"]}
这种做法的缺陷是,一个_arrayop控制了整个Playload的array动作,所以,同一Playload如果需要多种动作的情况,请拆分为多次请求。
5. DELETE 删除资源
DELETE里面能不能带payload,这个RFC 7231 "Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content"是这么规定的:A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
所以,并没有禁止,是否支持依赖于服务端实现,比如某些版本的Tomcat或 Jetty就会忽略payload。
而OpenAPI3.0定义里面描述为:
The request body applicable for this operation. The requestBody is only supported in HTTP methods where the HTTP 1.1 specification RFC7231 has explicitly defined semantics for request bodies. In other cases where the HTTP spec is vague, requestBody SHALL be ignored by consumers.
说明,对OpenAPI规范而言,这种模棱两可的描述,是明确要ignored的。
经过我们的实践,发现DELETE带payload需求很多,所以,我们明确一下,支持DELETE带payload的行为,假如遇到实现不支持时,请使用DELETE Over POST实现。
举例:
删除ID为2的学生。
DELETE /class/students/2
删除有Jim这个朋友的所有学生。
DELETE /class/students
{"friends": ["Jim"]}
或表达为DELETE Over POST:
POST /class/students?_method=DELETE
{"friends": ["Jim"]}
4. 示例
@AllArgsConstructor
@Data
public class Person {private String id;private String name;private int age;
}
@RequestMapping("/api/v1/user")
@RestController
public class UserController {@PostMappingpublic String insertUser( @Validated @RequestBody Person person){System.out.println(person);return "person";}@DeleteMappingpublic String deleteUser(@Validated @RequestBody Person person){System.out.println(person);return "person";}
}
@RequestMapping("/api/v1/user")
@RestController
public class UserController {@PatchMappingpublic String updateUser(@Validated @RequestBody List<String> ids){System.out.println(ids);return "person";}@DeleteMappingpublic String deleteUser(@Validated @RequestBody List<String> ids){System.out.println(ids);return "person";}
}
相关文章:

实战 - Restful APi 格式规范
文章目录 1. 特征2. 优点3. 动作1. GET 获取资源2. POST 创建资源3. PUT 整体替换4. PATCH 部分替换5. DELETE 删除资源 4. 示例 RESTful是一种API的设计风格,他和GraphQL ,JSON-RPC,WebService类似,用于定义在CS、BS架构下暴露服…...

《Linux从练气到飞升》No.21 Linux简单实现一个shell
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...

【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路
简介: 随着数字化转型的飞速发展,企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案,极大地简化了应用程序的开发过程。在这一领域,iVX低代码平台作为领先的创业公司,正在…...
zookee 安装
1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1:wget是一个下载指令,后面可以跟下载连接去从服务器上下载东西。 方案2:也可以先下载到windows上,再通…...

OpenWrt编译自己的应用程序
编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程,来编写成自己的应用程序 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码: git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update…...
MySQL 50 题。
MySQL 50 题。 文章目录 MySQL 50 题。数据库。sql。 数据库。 CREATE SCHEMA new_schema DEFAULT CHARACTER SET utf8mb4 ;Operation failed: There was an error while applying the SQL script to the database. Executing: CREATE SCHEMA new_schema DEFAULT CHARACTER SE…...
强化学习算法总结 (1)
强化学习算法总结 (1) 1.综述 强化学习是通过与环境进行交互,来实现目标的一种计算方法。 s − a 1 − r − s ′ s - a_1 - r- s s−a1−r−s′ 1.1强化学习优化目标 p o l i c y a r g m a x p o l i c y E ( a , s ) [ r e w a r d ( s , a ) ] policy ar…...

Qt应用开发(基础篇)——向导对话框 QWizard
一、前言 QWizard类继承于QDialog,为有向导界面需求的应用环境提供了一个框架。 对话框窗口 QDialog QWizard向导对话框是一个拥有队列界面的特殊对话框,向导的目的是引导用户一步一步的完成预设的流程。向导常用于软件安装界面向导、硬件线路安装向导、…...

Python类的方法
Python类的方法主要分为实例方法、类方法和静态方法三种。 1 实例方法 以self作为第一个参数的方法,就是类的实例方法。该方法由类的实例调用,Python会把调用该方法的实例对象传递给self。 如下代码定义了一个名为A的类。 class A:def __init__(self…...

变电站自动化监控系统
力安科技变电站自动化监控系统是以箱式变电站为管理对象,加装箱变网关,在完成箱变智能化改造的基础上,依托电易云,构建一体化智慧箱变及运维系统。智能箱式变电站被广泛应用于住宅小区、城市公用变压器、工厂、商场、机场、电站等…...

MySql学习笔记11——DBA命令介绍
DBA命令 数据导入 要进入Mysql 创建数据库 create database database_name;使用数据库 use database_name;初始化数据库 source .sql文件地址,不能加双引号;数据导出 要在windows的dos环境下进行 导出数据库 mysqldump database_name > 存放…...
Webpack 复习小结
nodejs学习参考 node常用命令: node xxx.js 执行js文件 npm init -y 初始化package.json npm i 软件包名 下载软件包到本地 npm i 软件包名 -g 下载软件包到全局 npm uni 软件包名 删除软件包 系统优化CDN使用 CDN for free 需求:开发模式使用本地第三…...

Laravel chunk和chunkById的坑
在编写定时任务脚本的时候,经常会用到chunk和chunkById的API。 一、前言 数据库引擎为innodb。 表结构简述,只列出了本文用到的字段。 字段类型注释idint(11)IDtypeint(11)类型mark_timeint(10)标注时间(时间戳) 索引&#x…...

从零开始学习 Java:简单易懂的入门指南之泛型及set集合(二十二)
泛型及set集合扩展 1.泛型1.1泛型概述 2.Set集合2.1Set集合概述和特点【应用】2.2Set集合的使用【应用】 3.TreeSet集合3.1TreeSet集合概述和特点【应用】3.2TreeSet集合基本使用【应用】3.3自然排序Comparable的使用【应用】3.4比较器排序Comparator的使用【应用】3.5两种比较…...

JVM----GC(垃圾回收)详解
一、Automatic Garbage Collection(垃圾回收)简介 Automatic Garbage Collection (自动垃圾回收)是JVM的一个特性,JVM会启动相关的线程,该线程会轮训检查heap memeory,并确定哪些是未被引用的(…...
数据库的三个范式
数据库的三个范式是关系数据库设计中的一组规范,用于确保数据的有效性和一致性。这三个范式分别是: 第一范式(1NF):要求数据库表中的每一列都是不可分割的原子值。换句话说,每个表中的每个字段不能包含多个…...

谷歌浏览器打开白屏 后台还有还有很多google chrome进程在运行
环境: Win10 专业版 谷歌浏览器 版本 116.0.5845.141(正式版本) (64 位) L盾加密终端 问题描述: 谷歌浏览器打开白屏 后台还有还有很多google chrome进程在运行,要全部结束谷歌浏览器进程&…...

Java EE 突击 15 - Spring Boot 统一功能处理
Spring Boot 统一功能处理 一 . 统一功能的处理1.1 初级阶段 : 不断重复1.2 中级阶段 : 集成方法1.3 高级阶段 : Spring AOP1.4 超高级阶段 : Spring 拦截器准备工作实现拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理扩展 : 统一访问前缀添加 二 . 统一异常的…...

JasperReport定义变量后打印PDF变量为null以及整个pdf文件为空白
问题1: JasperReport打印出来的整个pdf文件为空白文件; 问题2:JasperReport定义变量后打印PDF变量为null; 问题1原因是因为缺少数据源JRDataSource JasperFillManager.fillReport(jasperReport, params,new JREmptyDataSource());如果你打印…...

Python 及 Pycharm 的安装 2023.8
Python 及 PyCharm 的安装 仅适用于 Windows 系统! 视频教程:【Python及Pycharm的安装 2023.8】 https://www.bilibili.com/video/BV1A34y1T7Gu 文章目录 Python 及 PyCharm 的安装安装 Python安装 PyCharmHi, PyCharmPyCharm 汉化 安装 Python 进入 …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...