Web后端开发技术:RESTful 架构详解
RESTful 是一种基于 REST(表述性状态转移,Representational State Transfer)架构风格的 API 设计方式,通常用于构建分布式系统,特别是在 Web 应用开发中广泛应用。REST 是一种轻量级的架构模式,利用标准的 HTTP 协议来实现服务器和客户端之间的通信。
 
RESTful API 是基于资源的操作,通过 URI(统一资源标识符)定位资源,通过 HTTP 方法(GET、POST、PUT、DELETE 等)操作资源,并使用标准的 HTTP 状态码来反馈操作结果。与传统的 RPC(远程过程调用)不同,RESTful 更加面向资源而非方法调用。
REST 的基本原则
RESTful API 是基于 REST 的设计原则构建的。REST 架构遵循六大设计原则,这些原则确保了 REST API 的高效性和可扩展性。
1 客户端-服务器架构(Client-Server)
RESTful 架构基于客户端和服务器的分离。客户端负责用户界面和应用逻辑,服务器负责数据存储和业务逻辑处理。客户端通过发送 HTTP 请求从服务器获取或操作资源。客户端和服务器之间的这种职责分离能够提高应用的可扩展性、灵活性和可维护性。
 
2 无状态性(Stateless)
RESTful API 的每个请求都是无状态的。服务器不会在请求之间存储客户端的状态信息,每个请求都应包含处理请求所需的全部信息。无状态性带来的优势是:
- 可扩展性:由于服务器不需要管理客户端的状态,任何服务器都可以独立处理任何请求,极大地提升了水平扩展的能力。
 - 简单性:无状态的交互简化了服务器端的设计,减少了状态管理的复杂性。
 
无状态意味着客户端在每次请求时都必须提供必要的认证信息、请求上下文等。
3 统一接口(Uniform Interface)
RESTful API 强调使用统一的接口来操作资源。统一接口的设计能够提高系统的可理解性和简化开发者的使用体验。主要的统一接口包括:
- 资源的唯一标识:每个资源都有一个唯一的 URI。
 - 通过表述操作资源:客户端通过资源的表述(如 JSON 或 XML)与服务器交互。
 - 自描述消息:每个请求和响应都应包含足够的信息,使得客户端可以理解和处理消息内容。
 - 超媒体作为应用状态引擎(HATEOAS):在响应中提供进一步操作的链接,客户端可以通过这些链接进行后续操作。
 
4 可缓存性(Cacheable)
RESTful API 可以通过 HTTP 缓存机制提高性能。服务器在响应中可以指明响应是否可缓存,以及缓存的过期时间。当响应可缓存时,客户端可以在有效期内重用缓存数据,减少对服务器的请求负载。使用缓存还可以显著提高 API 的性能,减少带宽占用。
5 分层系统(Layered System)
RESTful API 支持分层架构,客户端通常无法直接感知服务器端的复杂性。可以将应用分层为负载均衡器、代理服务器、数据存储等不同的层,提升系统的安全性、可扩展性以及复用性。这种分层机制允许多个中间层共同工作,例如 CDN 加速、认证代理等。
6 按需代码(Code on Demand)
尽管 RESTful 主要强调数据的传递,按需代码允许服务器在必要时将执行代码(如 JavaScript)传递给客户端,以提高客户端的功能。这是可选的设计原则,并不是所有 RESTful API 都需要实现。
RESTful API 的基本概念

RESTful 的设计基于资源操作,它将网络中的数据和功能抽象为资源,每个资源通过 URI 来标识,并且通过标准的 HTTP 方法来操作这些资源。
1 资源(Resource)
在 RESTful API 中,资源是架构的核心概念。资源代表了服务端的某种实体,通常与业务对象相关,如用户、订单、产品等。资源不仅可以是单个对象,还可以是某类对象的集合。
每个资源都有一个唯一的 URI 来标识。例如,/users/1 表示用户 ID 为 1 的用户,而 /products 表示所有产品的集合。
资源的表述是资源在网络上的传输形式,通常是 JSON 或 XML 格式。表述是客户端与服务器交互的实际内容。
2 HTTP 方法(HTTP Methods)

RESTful API 使用标准的 HTTP 方法来执行对资源的操作。常用的 HTTP 方法包括:
- GET:用于获取资源。请求 URL 对应的资源会被返回给客户端。
 - POST:用于创建新的资源。客户端向服务器提交数据,服务器根据数据创建新的资源。
 - PUT:用于更新资源。客户端发送的数据会替换服务器上资源的现有状态。
 - DELETE:用于删除资源。请求 URL 对应的资源会被删除。
 - PATCH:部分更新资源。与 PUT 不同,PATCH 只修改资源的部分内容。
 
3 URI 设计
URI 是资源的唯一标识符。RESTful API 强调清晰、简洁的 URI 设计,通常使用名词来表示资源,而不是动词。动词的操作通过 HTTP 方法来表达。
URI 设计的常见模式:
- 获取所有用户:
GET /users - 获取特定用户:
GET /users/{id} - 创建新用户:
POST /users - 更新用户:
PUT /users/{id} - 删除用户:
DELETE /users/{id} 
4 状态码(HTTP Status Codes)
RESTful API 利用标准的 HTTP 状态码来表示请求的结果状态。常见的状态码包括:
- 200 OK:请求成功,并返回数据。
 - 201 Created:资源创建成功。
 - 204 No Content:请求成功,但没有返回任何内容(通常用于 DELETE 操作)。
 - 400 Bad Request:客户端请求无效,服务器无法处理。
 - 401 Unauthorized:请求未经过认证或认证信息无效。
 - 403 Forbidden:服务器拒绝请求,权限不足。
 - 404 Not Found:请求的资源不存在。
 - 500 Internal Server Error:服务器内部错误,无法完成请求。
 
RESTful API 的设计原则
RESTful API 的设计不仅需要遵循 REST 的架构原则,还需要考虑实际应用中的诸多细节。以下是 RESTful API 设计中的一些重要原则。
4.1 资源的层次结构
资源通常具有自然的层次结构,这种层次关系可以通过 URI 表现出来。例如:
- 获取某用户的所有订单:
GET /users/{id}/orders - 获取某用户的某个订单:
GET /users/{id}/orders/{orderId} 
这种层次结构有助于明确资源之间的关联关系,使 API 的设计更加直观和易于理解。
2 数据过滤、分页与排序
当返回资源的集合时,通常需要对数据进行过滤、分页和排序。这可以通过 URL 查询参数来实现。
- 过滤:
GET /users?age=30&gender=male表示获取年龄为 30 且性别为男性的用户。 - 分页:
GET /users?page=2&limit=50表示获取第 2 页的用户,每页返回 50 条记录。 - 排序:
GET /users?sort=age,asc表示按年龄升序排列用户。 
4.3 版本控制
随着 API 的发展,可能会发生改变,这时候需要对 API 进行版本控制。常见的版本控制方式包括:
- 在 URI 中指定版本:
GET /v1/users表示第一个版本的用户资源。 - 通过 HTTP 头部指定版本:通过 
Accept头部来指定版本:Accept: application/vnd.myapi.v1+json。 
4.4 安全性
RESTful API 需要通过多种机制来保障安全性:
- 认证与授权:常见的认证机制包括 OAuth 2.0、API Key 等。OAuth 2.0 是目前较为流行的认证机制,支持第三方授权。
 - HTTPS:API 通信应使用 HTTPS 加密,以确保数据传输的安全性。
 - 防护机制:防止常见的 Web 攻击,如 SQL 注入、跨站请求伪造(CSRF)等。
 
4.5 错误处理
良好的错误处理机制能够帮助开发者更快地理解错误原因,并做出相应的处理。API 应返回清晰的错误信息和合适的 HTTP 状态码。
{"error": {"code": 400,"message": "Invalid request parameter","details": [{"field": "email","issue": "Invalid format"}]}
}
 
4.6 HATEOAS(Hypermedia as the Engine of Application State)
HATEOAS 是 REST 的一个重要原则,它要求在 API 响应中提供可执行的链接,以指导客户端进行后续操作。通过这些超媒体链接,客户端无需了解 API 的内部实现细节即可操作资源。
{"id": 1,"name": "John Doe","links": [{ "rel": "self", "href": "/users/1" },{ "rel": "orders", "href": "/users/1/orders" }]
}
 
5. RESTful API 与其他架构的对比
5.1 RESTful 与 SOAP

SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,通常用于需要高安全性和事务控制的场景。SOAP 和 RESTful API 的主要区别在于:
- SOAP 是基于协议的,而 REST 是基于架构风格的。
 - SOAP 消息通常更加复杂,包含大量的 XML 元素,而 REST 通常使用 JSON,更加轻量。
 - SOAP 支持更多的安全性标准(如 WS-Security),但这也使其更加复杂。
 
RESTful API 通常用于轻量级的 Web 应用,而 SOAP 更适合于企业级、需要复杂事务处理的场景。
5.2 RESTful 与 GraphQL
GraphQL 是一种由 Facebook 开发的查询语言,与 RESTful API 相比,它更加灵活。客户端可以通过 GraphQL 查询自己需要的数据结构,而不必依赖服务器端预定义的响应格式。
RESTful 和 GraphQL 的主要区别在于:
- RESTful API 返回固定的数据结构,而 GraphQL 可以根据客户端的需求返回定制化的数据。
 - RESTful API 通过多个端点提供不同资源的操作,而 GraphQL 通过单个端点完成所有查询。
 - RESTful 更适合简单的 CRUD 操作,而 GraphQL 更适合复杂的数据查询。
 
6. RESTful API 的最佳实践
- 使用 HTTP 方法语义化:确保正确使用 GET、POST、PUT、DELETE 等方法。
 - 清晰的 URI 设计:使用名词表示资源,并保持简洁、清晰。
 - 合理的状态码使用:返回合适的 HTTP 状态码,以便客户端能够理解请求结果。
 - 提供丰富的错误信息:在错误响应中提供详细的错误描述,便于调试。
 - 保证安全性:使用 HTTPS 加密数据传输,确保 API 的安全性。
 - 支持缓存:通过 HTTP 头部(如 
Cache-Control)实现对静态资源的缓存。 
7. 结论
RESTful API 是现代 Web 开发中的重要架构风格,它通过标准化的接口、资源操作以及 HTTP 协议,提供了高效、易用的 API 设计方式。RESTful API 的设计遵循一系列原则,包括无状态性、统一接口、分层系统等,确保了其灵活性和可扩展性。
RESTful API 与 SOAP、GraphQL 等其他 API 设计方式各有优劣,开发者应根据具体业务需求选择合适的架构。通过合理的 URI 设计、错误处理、版本控制和安全机制,开发者可以构建高效、可靠且可维护的 RESTful API 系统。
//python 因为爱,所以学
print("Hello, Python!")
 
关注我,不迷路,共学习,同进步
关注我,不迷路,共学习,同进步
相关文章:
Web后端开发技术:RESTful 架构详解
RESTful 是一种基于 REST(表述性状态转移,Representational State Transfer)架构风格的 API 设计方式,通常用于构建分布式系统,特别是在 Web 应用开发中广泛应用。REST 是一种轻量级的架构模式,利用标准的 …...
【Fastapi】参数获取,json和query
【Fastapi】参数获取,json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说,懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…...
【Node.js】初识微服务
概述 Node.js 的微服务架构是一种通过将应用程序分解为独立的、松耦合的小服务的方式进行系统设计。 每个微服务负责处理一个特定的业务功能,并且这些服务可以独立开发、部署、扩展和管理,并且可以通讯。 它的核心思想就是解耦。 微服务和微前端是类…...
React项目实战(React后台管理系统、TypeScript+React18)
### 项目地址:(线上发布) (1)别人的项目地址 gitgitee.com:zqingle/lege-react-management.git (2)我自己的项目地址 gitgitee.com:huihui-999/lege-react-management.git ### B站讲解视频地址 https://www.bilibili.com/video/BV1FV4y157Zx?p37&spm_id_frompageDrive…...
【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前,中国医药产业发展态势良好,创新能力不断增强,然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…...
【iOS】KVC
文章目录 KVC的定义 容器类中KVC的实现 KVC设值 KVC取值 KVC使用KeyPath KVC处理异常 KVC处理设值nil异常 KVC处理UndefinedKey异常 KVC处理数值和结构体类型属性 KVC键值验证 KVC处理集合 简单集合运算符 对象运算符 KVC处理字典 KVC应用 动态地取值和设值 用…...
【2024年华为杯研究生数学建模竞赛C题】完整论文与代码
这里写目录标题 基于数据驱动下磁性元件的磁芯损耗建模一、问题重述1.1问题背景1.2问题回顾 问题分析与模型假设模型建立与求解 基于数据驱动下磁性元件的磁芯损耗建模 一、问题重述 1.1问题背景 在现代电力电子和变压器设计中,磁性元件是确保能量高效传递和系统稳…...
svn回退到以前历史版本修改并上传
svn回退到以前版本,并在以前版本上修改代码后,上传到svn库当中,如下步骤: 3、 以回退到版本号4为例:选中版本号4,右键->Revert to this version,在出现的对话框中 点击yes! 4、 5、...
fiddler抓包07_抓IOS手机请求
课程大纲 前提:电脑和手机连接同一个局域网 (土小帽电脑和手机都连了自己的无线网“tuxiaomao”。) 原理如下: 电脑浏览器抓包时,直接就是本机网络。手机想被电脑Fiddler抓包,就要把Fiddler变成手机和网络…...
Windows系统及Ubuntu系统安装Java
Java语言简介 Java是一种高级编程语言,Java语言的创始可以追溯到1990年代初,当时任职于Sun Microsystems(后来被甲骨文公司收购)的詹姆斯高斯林(James Gosling)等人开始开发一种名为“Oak”(名字来源于詹姆…...
uni-data-select 使用 localdata 传入数据出现 不回显 | 下拉显示错误的 解决方法
目录 1. 问题所示2. 正确Demo3. 下拉显示错误(Bug复现)4. 下拉不回显(Bug复现)1. 问题所示 uni-app的下拉框uni-data-select 使用 localdata 传入数据 主要总结正确的Demo以及复现一些Bug 数据不回显数据不显示下拉选项2. 正确Demo 详细的基本知识推荐阅读:uni-app中的…...
图解 TCP 四次挥手|深度解析|为什么是四次|为什么要等2MSL
写在前面 今天我们来图解一下TCP的四次挥手、深度解析为什么是四次? 上一片文章我们已经介绍了TCP的三次握手 解析四次挥手 数据传输完毕之后,通信的双方都可释放连接。现在客户端A和服务端B都处于ESTABLISHED状态。 第一次挥手 客户端A的应用进…...
DevExpress中文教程:如何将WinForms数据网格连接到ASP. NET Core WebAPI服务?
日前DevExpress官方发布了DevExpress WinForms的后续版本——将.NET桌面客户端连接到安全后端Web API服务(EF Core with OData),在本文中我们将进一步演示如何使用一个更简单的服务来设置DevExpress WinForms数据网格。 P.S:DevExpress WinForms拥有180…...
SpringBoot3核心特性-核心原理
目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…...
Linux:RPM软件包管理以及yum软件包仓库
挂载光驱设备 RPM软件包管理 RPM软件包简介 区分软件名和软件包名 软件名:firefox 软件包名:firefox-52.7.0-1.el7.centos.x86_64.rpm 查询软件信息 查询软件(参数为软件名) ]# rpm -qa #当前系统中所有已安装的软件包 ]# r…...
pod介绍与配置
1、pod概念介绍 Pod 是 kubernetes 基本调度单位。每个 Pod 中可以运 行一个或多个容器,共享 Pod 的文件系统、IP 和网络等资源,每个 Pod 只有一个 IP。 2、使用 yaml或json 文件创建 Pod 声明式文件方式创建 Pod,支持 yaml 和 json 1&…...
【Taro】初识 Taro
笔记来源:编程导航。 概述 Taro 官方文档:https://taro-docs.jd.com/docs/ (跨端开发框架) Taro 官方框架兼容的组件库: taro-ui:https://taro-ui.jd.com/#/ (最推荐,兼容性最好&…...
【设计模式-备忘录】
备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的内部状态,以便在将来某个时间可以恢复到该状态,而不暴露对象的内部实现细节。备忘录模式特别适合在需要支持撤销(Undo)操作的应…...
【数据结构】排序算法系列——快速排序(附源码+图解)
快速排序 接下来我们将要介绍的是排序中最为重要的算法之一——快速排序。 快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),最早由东尼霍尔提出。快速排序通常明显比其…...
Arthas thread(查看当前JVM的线程堆栈信息)
文章目录 二、命令列表2.1 jvm相关命令2.1.2 thread(查看当前JVM的线程堆栈信息)举例1:展示[数字]线程的运行堆栈,命令:thread 线程ID举例2:找出当前阻塞其他线程的线程 二、命令列表 2.1 jvm相关命令 2.…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
