实战 - 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 进入 …...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
