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!")

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143902.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型超参数调优:开启 AI 潜能的钥匙

前言 在人工智能的广袤领域中,大语言模型(LLM)凭借其强大的实力,不断重塑着我们对机器理解语言的认知。然而,要使这些模型在特定应用场景中发挥最大效能,关键在于巧妙调整其超参数。本文将引领你深入探究 …

【SSM-Day2】第一个SpringBoot项目

运行本篇中的代码:idea专业版或者idea社区版本(2021.1~2022.1.4)->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】第一个SpringBoot项目 框架->Spring家族框架快速上手Spring BootSpring Boot的作用通过idea创建S…

Kettle报错:使用mysql向hive中插入数据只能插入两条的错误

错误展示 我们在用kettle,使用mysql向hive中插入数据的时候,创建好了一个转换,里面的操作也全部完成了之后,在执行时爆出一下错误 例如我这里写入的表输入为: 表输出为: 解决办法 看起来是一点问题也没有…

HFSS 常见仿真警告、报错及bug处理

目录 引言提示信息警告信息报错信息导入csv文件报错 内部bugHFSS切换工程文件,视图窗口卡顿 引言 本文主要用于收录HFSS仿真中常见的错误及处理方法。欢迎大家在评论区贴出自己的报错信息,一起讨论分享。 提示信息 提示信息:Port 7 suppor…

C++调用C# DLL之踩坑记录

C是非托管代码,C#则是托管代码,无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术:CLR Interop和COM Interop 后者要将C# 类库注册为COM组件,本文只探讨CLR,要通过C CLR写中间层代码 方式一&…

htaccess转换nginx工具

115工具网为您提供htaccess与nginx在线转换,apache伪静态文件转为nginx重写规则,htaccess伪静态规则换nginx,apache RewriteRule转rewrite,apache伪静态文件转nginx重写,apache转nginx重写规则,本工具支持所有的htaccess伪静态、基本的配置规则、重定向等转换为ngin…

Golang开发的OCR-身份证号码识别(不依赖第三方)

身份证号码识别(golang) 使用golang的image库写的身份证号码识别,还有用了一个resize外部库,用来更改图片尺寸大小,将每个数字所在的图片的大小进行统一可以更好的进行数字识别,库名 :“github…

C语言 ——— 编写函数,判断一个整数是否是回文整数

目录 题目要求 代码实现 题目要求 编写一个函数,用来判断一个整数是否是回文整数,如果是回文整数就返回 true ,如果不是就返回 false 举例说明: 输入:121 输出:true 输入:1321 输出&#xf…

怎么把文件生成二维码活码?支持生成多种格式文件的二维码教程

怎么把文件做成二维码分享给其他人预览或下载呢?现在使用二维码来展示或者分享文件的使用场景越来越多,这种方式可以帮助其他人更快的获取文件内容,有利于提升文件传输的效率。二维码可以长期存储文件,获取文件会更加的灵活方便&a…

翻转对00

题目链接 翻转对 题目描述 注意点 给定数组的长度不会超过50000输入数组中的所有数字都在32位整数的表示范围内 解答思路 本题与区间和的个数类似,都是使用归并排序统计满足题意的数量,归并排序后可以有效减少比较的数量归并排序的思路为&#xff1…

心觉:成功学就像一把刀,有什么作用关键在于使用者(一)

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作173/1000天 很多人觉得成功学是鸡汤,是没用的,甚至是骗人的 我先保持中立,不知道对不对 我们先…

【Python报错已解决】AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

程序员的宝藏,七大常用Python库!

在Python的广泛应用中,七大常用库扮演着至关重要的角色。这些库覆盖了数据分析、机器学习、科学计算等多个领域,为开发者提供了强大的工具集。以下是这七大常用Python库的详细介绍及其优缺点: 1. NumPy 详细介绍: NumPy是Python的…

在Ubuntu使用VScode配合GDB完成代码调试

想学一下Ubuntu下的vscode代码调试,在网上找了很多博客,发现根本不管用,而且很多都是在Windows下的,与我的需求(使用CMakeLists.txt)不同,根本不能用,研究了一下。并记录。 1.创建C…

浅谈人工智能之Java调用基于Ollama本地大模型

引言 随着人工智能技术的飞速发展,大型语言模型(Large Language Models, LLMs)已成为自然语言处理领域的研究热点。Ollama是一个强大的工具,它使得在本地部署和管理这些大型语言模型变得更加便捷。本文档旨在指导Java开发者如何在…

【C++ Primer Plus习题】16.7

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <vector> #include <…

I/O流(Java)

目录 1. IO概述 1.1 什么是IO 1.2 IO的分类 1.3 IO的流向说明图解 1.4 顶级父类 2. File类 2.1 概述 2.2 构造方法 2.3 常用方法 2.3.1 获取功能的方法 2.3.2 绝对路径和相对路径 2.3.3 判断功能的方法 2.3.4 创建删除功能的方法 2.3.5 目录的遍历 3. 字节流 3…

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

如何将扫码提交的数据直接推送到企业微信、钉钉、飞书群聊?详细教程

功能介绍 在草料制作的表单中&#xff0c;填表人扫码填写并提交数据后&#xff0c;这些信息可以立即通过企业微信、钉钉或飞书自动推送到相应的群聊中&#xff0c;实现即时共享和沟通&#xff0c;提升团队协作效率。 设置教程 企业微信 钉钉 飞书