单一职责原则与REST API设计:如何定义清晰的资源与职责
在软件设计中,单一职责原则(Single Responsibility Principle, SRP)和 REST API 设计是两个重要的概念。单一职责原则是一种设计原则,它强调一个类或模块应当只有一个单一的职责,这有助于提高系统的可维护性和扩展性。而 REST API 设计关注的是如何构建具有良好可用性和可扩展性的 API 接口,以支持现代 Web 应用和服务。在设计 REST API 时,将单一职责原则应用于资源和职责的定义,可以显著提升 API 的清晰度、可用性和一致性。
1. 单一职责原则(SRP)
1.1 SRP 的定义
单一职责原则是面向对象设计中的一个基本原则,最早由 Robert C. Martin(“Uncle Bob”)提出。SRP 的核心思想是一个类(或模块)应当只有一个单一的职责,即它应该只关注一件事,并且这个职责应该被完全封装在这个类(或模块)中。这使得系统的各个部分具有更高的内聚性,并且更容易进行维护和扩展。
1.2 SRP 的重要性
-
减少耦合:通过将系统分解成多个具有单一职责的模块,可以减少模块之间的依赖关系,使得修改某一个模块时不会影响到其他模块。
-
提高可维护性:当一个类或模块只负责一个职责时,代码的理解和维护变得更加简单。
-
增强可测试性:具有单一职责的模块更容易进行单元测试,因为测试可以集中在一个特定的功能上。
-
促进复用:分离的模块可以在不同的上下文中复用,减少代码的重复。
2. REST API 设计
2.1 REST 的基本概念
REST(Representational State Transfer)是一种架构风格,用于设计网络应用程序。RESTful API 是一种通过 HTTP 协议进行通信的 API,它基于一系列标准的 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。RESTful API 的设计旨在创建简单、可扩展和易于使用的接口。
2.2 REST API 的设计原则
-
资源导向:REST API 设计应以资源为中心。每个资源应有一个唯一的 URI,通过 HTTP 方法对资源进行操作。
-
无状态:每个请求都应包含所有处理该请求所需的信息。服务器不应存储客户端的状态,保证了请求的独立性。
-
可缓存性:API 的响应应被设计为可缓存的,以提高性能和响应速度。
-
统一接口:REST API 应具有统一的接口标准,使得客户端和服务器之间的交互更加一致和简单。
-
分层系统:API 应支持分层架构,客户端不应需要知道服务器的具体实现细节。
3. 将 SRP 应用于 REST API 设计
3.1 定义清晰的资源
在 REST API 设计中,资源是操作的核心。资源可以是任何具有独特身份的实体,例如用户、订单、产品等。应用 SRP 到资源定义中意味着每个资源应专注于一个明确的概念或功能。
3.1.1 识别资源
识别资源是设计 RESTful API 的第一步。资源应该具有唯一标识符,并且能够描述清楚其业务功能。例如,在一个电子商务系统中,可以定义以下资源:
- 用户(/users)
- 订单(/orders)
- 产品(/products)
每个资源都应有一个唯一的 URI,使得客户端可以通过这些 URI 进行操作。例如,/users/{userId}
可以用来访问特定用户的信息。
3.1.2 资源的子资源
有时,一个资源可能包含其他资源,这称为子资源。例如,一个订单可能包含多个产品。可以将这种关系建模为以下 URI:
/orders/{orderId}/products
这种设计使得 API 更加清晰,并能够反映出资源之间的层次关系。
3.2 分离资源的职责
将 SRP 应用于资源的设计意味着每个资源应只承担与其自身相关的职责。避免将多个不相关的功能放在同一个资源中。例如,用户资源(/users)不应处理与订单相关的逻辑。相反,订单应该有自己的资源(/orders),并且与用户资源分开。
3.2.1 资源的 CRUD 操作
每个资源应支持基本的 CRUD(创建、读取、更新、删除)操作,这些操作应对应于 HTTP 方法:
- 创建:使用 POST 方法
- 读取:使用 GET 方法
- 更新:使用 PUT 或 PATCH 方法
- 删除:使用 DELETE 方法
例如,对于用户资源,可以定义以下操作:
POST /users
:创建用户GET /users/{userId}
:获取用户信息PUT /users/{userId}
:更新用户信息DELETE /users/{userId}
:删除用户
3.3 处理资源之间的关系
在设计 API 时,资源之间的关系也需要明确。例如,用户和订单之间的关系可以通过以下方式处理:
- 用户创建订单:
POST /users/{userId}/orders
- 获取用户的所有订单:
GET /users/{userId}/orders
- 获取特定订单:
GET /orders/{orderId}
通过这种方式,将用户和订单的关系保持在清晰的 API 设计中,同时确保每个资源保持其单一职责。
3.4 设计 RESTful API 的请求和响应
3.4.1 请求格式
在 RESTful API 中,客户端请求应当明确并符合约定的格式。例如,创建资源的请求应包含必要的字段,而更新请求应只包含修改的字段。使用 JSON 作为请求和响应的数据格式是一个常见的做法,因为 JSON 具有良好的可读性和广泛的支持。
请求示例:
{"username": "john_doe","email": "john@example.com","password": "securepassword"
}
3.4.2 响应格式
API 的响应应包含处理结果和相关的信息。例如,当创建资源成功时,应返回资源的详细信息以及其唯一标识符。响应的 HTTP 状态码应准确反映操作的结果,如:
200 OK
:成功读取或更新资源201 Created
:成功创建资源204 No Content
:成功删除资源400 Bad Request
:请求格式错误404 Not Found
:资源未找到
响应示例:
{"userId": "123","username": "john_doe","email": "john@example.com"
}
3.5 实现和维护单一职责的 API 设计
3.5.1 API 版本控制
为了保持 API 的稳定性和兼容性,进行 API 版本控制是必要的。通过在 URI 中包含版本号,例如 /v1/users
和 /v2/users
,可以在不影响现有客户端的情况下进行 API 的更新和改进。
3.5.2 文档和规范
编写清晰的 API 文档可以帮助开发者理解和使用 API。API 文档应详细描述资源、操作、请求和响应格式,以及错误处理方式。工具如 Swagger 或 OpenAPI 可以帮助生成和维护 API 文档。
4. 结合 SRP 和 REST API 设计的最佳实践
4.1 资源的语义清晰
设计 API 时,确保每个资源和操作具有明确的语义,避免模糊或重叠的功能。例如,不应将用户的登录逻辑与用户的基本信息管理混合在同一个 API 中。
4.2 关注 API 的一致性
保持 API 的一致性对于提升用户体验和降低学习成本至关重要。使用统一的命名约定、HTTP 状态码和错误处理机制,可以让 API 更加直观和易于使用。
4.3 提供有用的错误信息
当出现错误时,API 应提供清晰的错误信息,帮助客户端理解问题并进行修复。错误响应应包含错误代码和描述。
错误响应示例:
{"error": "InvalidRequest","message": "The request is missing required fields."
}
4.4 实现测试和监控
对 API 进行充分的测试,以确保其正确性和可靠性。包括单元测试、集成测试和端到端测试。同时,使用监控工具跟踪 API 的性能和健康状况,以便及时发现和解决问题。
5. 总结
单一职责原则(SRP)和 REST API 设计是软件工程中的两个关键方面,将它们有效地结合可以帮助构建高质量的 API。通过定义清晰的资源和职责,遵循 RESTful 原则,以及保持 API 的一致性和可维护性,可以创建
易于使用和扩展的 API。应用 SRP 的设计思想,有助于将复杂的功能分解为具有单一职责的模块,使系统更加稳定、可维护并具有较高的可扩展性。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
单一职责原则与REST API设计:如何定义清晰的资源与职责
在软件设计中,单一职责原则(Single Responsibility Principle, SRP)和 REST API 设计是两个重要的概念。单一职责原则是一种设计原则,它强调一个类或模块应当只有一个单一的职责,这有助于提高系统的可维护性和扩展性。…...
![](https://i-blog.csdnimg.cn/direct/41ba1c8580304ba596da30b5766bd811.png)
JAVA IO模型
我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负…...
![](https://i-blog.csdnimg.cn/blog_migrate/5309fd059aea4f2ccf0c6d984fd47572.png#pic_center)
《C/C++实战专栏》介绍
🚀 前言 本文是《C/C实战专栏》专栏的说明贴(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)。 专栏介绍:以多年的开发实战为基础,总结并讲解一些的C/C基础与项目实战进阶内容&…...
![](https://www.ngui.cc/images/no-images.jpg)
前端跨域2
前端跨域2 前端跨域解决方案(11种方案) 1.JSONP跨域解决方案的底层原理 script、img、link、iframe...<script src"https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>// 这个就是因为script标签没有跨域限制࿰…...
![](https://i-blog.csdnimg.cn/direct/2b07cfd708ea494096d550890bd6ae1a.png)
electron仿微信,新建贴合窗口
说明 在写electron项目时,只有一个主窗口不足以满足需求,我们通常还会打开很多个窗口。 怎么打开一个子窗口像微信的聊天界面一样,全贴合在一起,看起来像一个整体呢: 分析 这个窗口有点像element ui中的抽屉(drawe…...
![](https://i-blog.csdnimg.cn/direct/e3a28fed31df47989dc69add083d69e8.png)
uniapp微信小程序 分享功能
uniapp https://zh.uniapp.dcloud.io/api/plugins/share.html#onshareappmessage export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分享按钮console.log(res.target)}return {title: 自定义分享标题,path: /pages/test/test?id123}} }需要再真机…...
![](https://www.ngui.cc/images/no-images.jpg)
Java实现数据库数据到Excel的高效导出
在数据处理和分析工作中,经常需要将数据库中的数据导出到Excel文件中。本文将提供一个Java实现的示例,展示如何边从数据库读取数据,边将其写入Excel文件,同时注重内存效率。 环境配置: Java 1.8 或更高版本MySQL 5.7…...
![](https://i-blog.csdnimg.cn/direct/aa1b45c874a040e29530a5bf4b2c2d99.png)
python之matplotlib (8 极坐标)-圆与心
极坐标 极坐标图像的绘制类似于三维图像的绘制,只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…...
![](https://www.ngui.cc/images/no-images.jpg)
Kubernetes Pod调度基础
在传统架构中,我们总在考虑或者面临一个问题,我们的应用需要部署在哪里,我们的应用下载在哪里运行着?有一个服务不可访问了,去哪里排査?诸如此类的问题总是会出现在工作中。 但是在使用 Kubernetes 部署应用后ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/b90757530617a88cc618733bcca11b94.jpeg)
80页WORD方案深入了解大数据治理+大数据资产管理+数据运营
文档是一份80页可编辑的企业大数据智能管理与治理平台建设项目技术方案标书文档,涵盖了从项目需求分析、技术方案、建设方案、服务方案到类似案例介绍等多个方面的内容。 1. 项目需求分析 项目建设目标:旨在实现数据的可视化,确保决策者、行…...
![](https://i-blog.csdnimg.cn/direct/41b423c906e04e7e8765d2dc30ac403c.png)
OCC安装、VS2019编译运行(新手教程)
OCC安装、VS2019编译运行(新手教程) 简介1、OpenCasCade的下载和安装官网下载安装2、OpenCasCade的运行和编译(VS2019)修改配置文件环境变量配置3、验证代码项目配置运行cpp文件简介 作为一个刚接触OCC的程序员,可能会不知所措,无从下手,甚至在OCC的安装使用都困难重重…...
![](https://www.ngui.cc/images/no-images.jpg)
Mojo 实现排序功能
sort排序 实现排序功能。 您可以从包中导入这些 API。例如:algorithm from algorithm.sort import sortpartition partition[type: AnyRegType, cmp_fn: fn[AnyRegType]($0, $0, /) capturing -> Bool](buff: Pointer[*"type", 0], k: Int, size: …...
![](https://www.ngui.cc/images/no-images.jpg)
信息学奥赛一本通编程启蒙题解(3031~3035)
前言 Hello大家好我是文宇 正文 3031 #include<bits/stdc.h> using namespace std; double n,m,x; int main(){cin>>n>>m;xn-m*0.8;cout<<fixed<<setprecision(2)<<x;return 0; } 3032 #include<bits/stdc.h> using namespace…...
![](https://i-blog.csdnimg.cn/direct/967ea2233de64dcca33ab156aad4c770.png)
字符函数内存函数———C语言
字符分类函数 头文件: ctype.h 函数功能iscntrl判断字符是否为控制字符isspace判断字符是否为空白字符(空格,换页、换行、回车、制表符或垂直制表符)isdigit判断字符是否为十进制数字isxdigit判断字符是否为十六进制数字(0-9)(a…...
![](https://www.ngui.cc/images/no-images.jpg)
c语言跨文件传输数据
在 C 语言中,可以通过以下几种方式获取其他 C 文件中定义的变量: 一、使用 extern 关键字 在需要获取变量的文件中,使用extern关键字声明该变量。 例如,如果在other.c文件中有一个全局变量int globalVar;,在当前文件中…...
![](https://i-blog.csdnimg.cn/direct/2024603686864f9fb45c15890e75a993.jpeg)
企业文件防泄密怎么做?10款透明加密软件排行榜
在信息时代,企业的核心竞争力往往体现在其拥有的知识和信息上,而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题,透明加密技术因其无缝集成和高效保护的特性,成为企业防泄密的首选方案。2024年…...
![](https://i-blog.csdnimg.cn/direct/665bf1d85bc440d6b4f852ce7a6089a2.png)
AI编程工具的力量:以AWS Toolkit与百度Comate为例,加速程序员开发效率
在当今的数字化转型浪潮中,人工智能(AI)技术不仅重塑了众多行业,也为软件开发领域带来了革命性的变化。AI编程工具,凭借其智能化的特性,正在成为程序员提高开发效率、优化代码质量和加速产品迭代的重要助力…...
![](https://i-blog.csdnimg.cn/direct/f8c6adb786a94bb78456565512a63806.png#pic_center)
smallpdf: 免费高效的PDF水印添加工具
引言 在数字文档管理和分享的过程中,保护版权和确保文档的原创性变得尤为重要。PDF文件作为一种广泛使用的格式,经常需要添加水印来表明所有权或提醒查看者注意文档的敏感性。本文将介绍一款名为smallpdf的免费工具,它能够轻松地为PDF文件添…...
![](https://www.ngui.cc/images/no-images.jpg)
java整合modbusRTU与modbusTCP
理解 Modbus TCP 报文格式,Modbus TCP 报文格式如下: | Transaction ID (2 bytes) | Protocol ID (2 bytes) | Length (2 bytes) | Unit ID (1 byte) | Function Code (1 byte) | Data (N bytes) |Transaction ID:标识事务的唯一标识符,确保正确的 Transaction ID:每个请求…...
![](https://img-blog.csdnimg.cn/img_convert/85c45bdaf519ff0bf77d8f4f9ee484b5.png)
四、Docker使用
1. 快速入门 1.1. Docker背景介绍 Docker是一个开源的平台,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环…...
![](https://i-blog.csdnimg.cn/direct/b2b9c8e4ada74dd5a030d0dc85f2de4a.png)
杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC
通过公式计算 * 波特率和采样点计算公式:* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…...
![](https://www.ngui.cc/images/no-images.jpg)
开发日记-EaxyExcel修改模板sheet名称
引入pom: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.1.1</version><scope>compile</scope></dependency> 编写自定义拦截器: impo…...
![](https://i-blog.csdnimg.cn/direct/e5415ecd3aa443f69a19235f528d45be.png)
微软AI人工智能认证有哪些?
微软提供的人工智能认证主要包括以下几个方面: Azure AI Fundamentals(AI900认证):这是一个基础认证,旨在展示与Microsoft Azure软件和服务开发相关的基本AI概念,以创建AI解决方案。它面向具有技术和非技术…...
![](https://www.ngui.cc/images/no-images.jpg)
基于缓存提高Java模板文件处理性能:减少磁盘I/O的实践与探索
1、优化背景及动机 背景 线上有一个需求:读取模板文件,并根据不同的业务将数据写入模板文件,生成一个新的文件。模板文件本身是不会变的,所以每次生成文件都要去读取一遍模板文件,会有很多的磁盘IO操作,并…...
![](https://www.ngui.cc/images/no-images.jpg)
C/C++ 线程局部存储(TLS)
在C或C中,线程局部存储(Thread-Local Storage,简称TLS)是一种用于存储线程特有数据的方法。这意味着每个线程都可以访问它自己的变量实例,而不会影响到其他线程中的同名变量。这在多线程程序中非常有用,因为…...
![](https://i-blog.csdnimg.cn/direct/c4f2b5a16dc3467f9a72d7cceaf32c8c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATXIuV2ludGVyYA==,size_20,color_000000,t_30,g_se,x_16#pic_center)
碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台
目录 0 专栏介绍1 基于多边形的碰撞检测2 碰撞检测仿真平台搭建2.1 多边形实例2.2 外部服务接口2.3 Rviz插件化 3 案例演示3.1 功能介绍3.2 绘制多边形 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战…...
![](https://i-blog.csdnimg.cn/direct/6030d8a3d9fd4118b593a2b15e4ab395.png)
nginx实验
源码编译 解压 进入目录查看文件 环境监测文件 下载c语言编译工具 指定功能 成功 拷贝 关闭 删除 关闭debug 启动 nginx的平滑升级以及版本回滚 解压 备份 查看进程 回滚 nginx命令的常用参数 查看参数 检测配置文件中的语法 测试并打印 静默模式 设置全局指令(不能…...
![](https://i-blog.csdnimg.cn/direct/a04144b0531341cebe32cf2fe030f54d.png)
新技术能够区分真实照片和 AI 伪造图片,但为何平台没有使用?|TodayAI
随着生成式 AI 图像工具的快速发展,网络上越来越多的图像真假难辨。尽管已有技术能够区分真实照片和 AI 伪造图片,但大多数在线平台尚未充分利用这一技术。随着美国总统大选临近,网络上充斥着关于候选人唐纳德特朗普和卡玛拉哈里斯的各种照片…...
![](https://i-blog.csdnimg.cn/direct/3f590729412a4e02a54487dc48b234f4.jpeg)
测量 Redis 服务器的固有延迟
redis-cli --intrinsic-latency redis-cli --intrinsic-latency 命令用于测量 Redis 服务器的固有延迟。 固有延迟指的是 Redis 服务器处理一个命令所需的最短时间,不包括网络延迟。通过这个测量,我们可以了解 Redis 服务器本身的性能,而不…...
![](https://i-blog.csdnimg.cn/direct/dc6e98f217634a00985599def7b6dba5.png)
【JVM】JVM内存模型与操作系统内存模型(一)
JVM内存模型与操作系统内存模型 Java进程在操作系统内存中的结构 JVM内存模型 可以这样理解:JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、本地方法栈、程序计数器.其实叫…...
![](/images/no-images.jpg)
昆山市住房和城乡建设局网站/杭州网站优化公司
计算机软件(Computer Software,又称软件)是指计算机运行所需的程序和程序相关文档,程序是对计算任务的处理对象和处理规则的描述;文档是为了便于理解程序所需的解释性信息。程序必须装入机器才能工作,文档一般是给人看的ÿ…...
![](/images/no-images.jpg)
滨海做网站的公司/东莞网站建设推广品众
在平时工作中,我们有时候需要对JSON 的某一个字段进行提取, 样例数据 : {"a1":22,"a2":"23"} {"a2":"23","a1":2233,a3:"22"} 可以使用 grep 完成功能࿱…...
![](http://hi.csdn.net/attachment/201201/28/0_1327739941OeTL.gif)
了解营销型企业网站建设/站长素材音效
Oaiei居住在A城市,并且是这个城市建设的总设计师。最近有个问题一直困恼着他。A城市里有三个大型工厂,每个大型工厂每天都需要消耗大量的石油,现在城市里要建设一个石油中转站,从石油中转站到三个大型工厂都需要铺设石油管道。现在…...
![](/images/no-images.jpg)
徐州哪家做网站好/网站用户体验优化
在64位 OL7 或者 RHEL7 上安装 Oracle Database 19c 数据库的要求在继续安装之前,请花一些时间认真复查以下各项要求,以避免安装二进制文件期间出现任何明显的问题。下载 Oracle Database 19c 软件从 OTN 下载 Oracle Database 19c 软件 - https://www.o…...
![](https://img-blog.csdnimg.cn/img_convert/4751e4d1c7abe41f7e66927ee4fbee1c.png)
泉州哪里建设网站/搜索关键词排行榜
写在开头: 说下我的经历吧。湖南大学毕业,学的是软件工程,那时候比较贪玩,专业知识学的不是很扎实,毕业后就在长沙本地找了家互联网公司工作了。 到今年六月份的话刚好毕业了五年了,同期和我一起出来的同学…...
![](/images/no-images.jpg)
怎样建设好网站/嘉兴seo网络推广
规则1 每个 PR 审查至少需要 2 个同组开发者的批准,管理者的审批不统计。 首先要注意的是,由于我所在的是一个 3 人团队,这是最理想的。所有的 修改 3 个开发者都 100% 知情。如果团队规模更大,情况可能会有所不同。你所追求的是…...