RESTful风格介绍

news2024/11/26 22:46:34
  • 😜           :是江迪呀
  • ✒️本文关键词HTTPRESTFul请求
  • ☀️每日   一言我已经习惯这样的失望了——《英雄联盟》奥恩

在这里插入图片描述

一、前言

为了更好地设计和构建分布式系统和网络应用,诞生了RESTful 风格,它的设计强调了简单性可伸缩性可维护性可组合性,这些特性使其成为构建分布式系统和 Web 服务的常用选择。遵循这些原则可以使 API 更具可读性可维护性可伸缩性

二、RESTFul介绍

2.1 原则和特点

RESTful 是一种架构风格,它是一组约束原则,用于设计分布式系统网络应用程序REST“Representational State Transfer” 的缩写,它强调网络中资源状态表现,并采用了一些关键原则

  • 资源 (Resources):REST 中,一切都被视为资源,每个资源都有一个唯一的标识符(通常是一个 URL)。这些资源可以是物理实体,也可以是虚拟概念,如数据服务文件等。

  • 状态 (State): 客户端通过资源的状态进行操作。资源的状态可以更改,例如,一个订单可以处于已支付或未支付的状态。

  • 表现层 (Representation): 资源的状态以某种方式呈现给客户端,通常是以 JSON XML 格式。客户端可以通过获取、创建、修改或删除这些资源的表现层来与资源进行交互。

  • 统一接口 (Uniform Interface): RESTful 服务应该具有统一的接口,包括一组标准的操作方法,如 GET(获取资源)POST(创建资源)PUT(更新资源)、DELETE(删除资源)等。

  • 状态无关性 (Stateless): 每个客户端请求必须包含足够的信息,以便服务器可以理解并处理请求,而不需要保存客户端的状态信息。每个请求都应该是独立的,服务器不会存储客户端的上下文信息。

  • 资源之间的链接 (Resource Linking):RESTful 架构中,资源之间可以通过超链接相互关联。这些链接可以帮助客户端导航资源之间的关系。

  • 无状态通信 (Stateless Communication): RESTful 通信是无状态的,每个请求都应该包含足够的信息,以便服务器可以理解并处理请求,而不需要存储客户端的状态信息。

2.2 优势

  • 简化通信: RESTful 风格基于 HTTP 协议,使用标准的 HTTP 方法和状态码,使通信更加简单和直观。这降低了开发者的学习成本,使他们能够更容易地理解和使用 API。

  • 统一接口: RESTful 风格倡导使用统一的接口原则,无论资源是什么,都使用相同的 HTTP 动词(GETPOSTPUTDELETE 等)来执行操作。这种一致性使得 API 更易于设计和维护。

  • 松散耦合: RESTful 架构鼓励松散耦合的设计,客户端和服务器之间的关系更加独立。这使得系统更容易扩展和维护,允许独立地修改客户端或服务器的一部分而不影响整体系统。

  • 可伸缩性: RESTful 架构天生支持分布式系统,它的无状态性和资源导向性使得系统更容易扩展,可以适应不断增长的用户和数据量。

  • 可见性: RESTful 的资源 URL自解释的,它们通常包含了有关资源的信息。这使得开发者和系统管理员可以更容易地理解和监控系统。

  • 性能: RESTful 风格的通信基于 HTTP,这是一个广泛部署和优化的协议。因此,RESTful 风格的 API 在性能方面通常表现出色。

2.3 如何使用

规范的使用RESTFul风格,首先要知道一个概念:以资源驱动的方式以资源驱动的方式书写接口的URL是一种 RESTful 风格的设计方法,它将网络应用程序的功能映射到资源的操作上,强调使用标准的 HTTP 方法(GETPOSTPUTDELETE 等)来执行操作。
主要体现在两个方面:HTTP请求方式URL命名

(1)URL命名:
在 RESTful 风格中,资源通常用名词来表示,而不是动词。例如,一个博客系统可以有文章资源,而不是 getArticle() fetchArticle() 方法。

示例:/articles 表示所有文章资源,/articles/1 表示ID1 的文章。

(2)HTTP请求方式:
标准的 HTTP 方法(GETPOSTPUTDELETE 等)用于表示对资源的操作。例如,

  • 使用 GET 方法来获取资源;
  • 使用 POST 方法来创建新资源;
  • 使用 PUT 方法来更新资源;
  • 使用 DELETE 方法来删除资源。

示例: 获取文章列表使用 GET 创建新文章使用 POST更新文章使用 PUT删除文章使用 DELETE

三、实际应用

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    private final List<User> userList = new ArrayList<>(); // 用于存放用户的列表

    // 获取所有用户列表
    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(userList);
    }

    // 获取单个用户信息
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = findUserById(id);
        if (user != null) {
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    // 创建新用户
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        userList.add(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(user);
    }

    // 更新用户信息
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
        User user = findUserById(id);
        if (user != null) {
            user.setUsername(updatedUser.getUsername());
            user.setEmail(updatedUser.getEmail());
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        User user = findUserById(id);
        if (user != null) {
            userList.remove(user);
            return ResponseEntity.noContent().build();
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}

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

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

相关文章

后端SpringBoot+前端Vue前后端分离的项目(二)

前言&#xff1a;完成一个列表&#xff0c;实现表头的切换&#xff0c;字段的筛选&#xff0c;排序&#xff0c;分页功能。 目录 一、数据库表的设计 ​编辑二、后端实现 环境配置 model层 mapper层 service层 service层单元测试 controller层 三、前端实现 interface接…

Acwing算法心得——现代艺术(统计遍历)

大家好&#xff0c;我是晴天学长&#xff0c;先用两个一维数组维护数据&#xff0c;再统计遍历二维数组&#xff0c;需要的小伙伴请自取哦&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;现代艺术 2) .算法思路 现代艺术 1.两个数组维护行和列 2.遍历数组…

命名空间的详讲

本篇文章旨在讲解C中命名空间的概念以及其相关注意事项&#xff01; C的介绍 C作为C语言的衍生&#xff0c;其对C语言中的一些缺陷进行了一些的补充和优化。但是C也对C语言具有兼容性&#xff01; 本文旨在讲解C对C语言中当声明的变量与库函数的一些标识符&#xff0c;关键字…

2023年MySQL实战核心技术第二篇

目录 五 . 日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f; 5.1 解释 5.2 重要的日志模块&#xff1a;redo log 5.2.1 解释 5.2.2 WAL&#xff08;Write-Ahead Logging&#xff09; 5.2.3 crash-safe。 5.3 重要的日志模块&#xff1a;binlog 5.3 .1 为什么会有…

【FPGA】通俗理解从VGA显示到HDMI显示

注&#xff1a;大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;” 贴个下载地址&#xff1a; 野火FPGA-Altera-EP4CE10征途开发板_核心板 — 野火产品资料下载中心 文档 hdmi显示器驱动设计与验证 — …

10.1 直流电源的组成及各部分的作用

在电子电路及设备中&#xff0c;一般都需要稳定的直流电源供电。本章所介绍的直流电源为单相小功率电源&#xff0c;它将频率为 50 Hz 50\,\textrm {Hz} 50Hz、有效值为 220 V 220\,\textrm V 220V 的单相交流电压转换为幅值稳定、输出电流为几十安以下的直流电压。 单相交流…

机器学习训练,没有机器怎么办

google的cobal&#xff0c;免费提供15G显存。 https://colab.research.google.com/drive/

十五、MySQL(DCL)如何实现用户权限控制?

1、为什么要实现用户权限控制&#xff1f; 在日常工作中&#xff0c;会存在多个用户&#xff0c;为了避免某些用户对重要数据库进行“误操作”&#xff0c;从而导致严重后果&#xff0c;所以对用户进行权限控制是必须的。 2、常见的权限类型&#xff1a; ALL,ALL PRIVILEGES …

数字孪生产品:数字化时代的变革引擎

数字孪生技术&#xff0c;作为一项前沿的科技创新&#xff0c;正在不断改变我们的世界。它为各行各业的发展提供了无限的可能性&#xff0c;成为了当今数字化时代的一大亮点。数字孪生产品&#xff0c;作为数字孪生技术的具体应用&#xff0c;将在未来发挥越来越重要的作用。 数…

Linux命令之文件管理

Linux命令之文件管理 创建文件删除文件移动文件拷贝文件查看文件文件统计信息的查看文件内容的查看文件的权限文件权限的介绍和表示文件权限的改变 文件的类型 查找文件 创建文件 创建文件的话&#xff0c;一般使用touch命令 touch file1(文件名字)删除文件 删除文件的话&…

QT QToolBox控件使用详解

本文详细的介绍了QToolBox控件的各种操作&#xff0c;例如&#xff1a;新建界面、添加页签、索引设置当前项、获取当前项的索引、获取当前项窗口、获取索引值是int的窗口、移除索引值项、获取项的数量、获取指定索引值、设置索引项是否激活、获取索引值项是否激活、设置项的图标…

可靠的可视化监控平台应用在那些场景?

可视化监控平台是一种用户友好的工具&#xff0c;可以帮助用户实时监控IT设备的运行状态和网络流量&#xff0c;以及监测安全性和性能指标。它们通常采用图形化界面&#xff0c;使得用户能够直观地了解设备和网络的状态。 以下是一些可视化监控平台常见的应用场景&#xff1a;…

R7 7840H和i7 1360p选哪个 R77840H和i71360p对比

i71360P采用10nm工艺 最高睿频 5GHz 十核心 十六线程 三级缓存 18MB热设计功耗(TDP) 28W 支持最大内存 64GB 内存类型 DDR4 3200MHzDDR5 5200MHz集成显卡 Intel Iris Xe Graphics 选i7 1360p还是r7 7840h这些点很重要看过你就懂了 http://www.adiannao.cn/dy r7 7840h采用4nm…

Chrome扩展开发实战:网页图片抓取,打造专属自己的效率插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

软件测试框架的面试题讲解

主要对测试框架的面试题讲解。 1.测试一个杯子怎么写测试用例&#xff1f; 界面&#xff1a;杯子外观 安全性&#xff1a;杯子有没有毒或细菌 可靠性&#xff1a;杯子从不同高度落下的损坏程度&#xff1b;杯子放水放置12个小时或者24小时&#xff0c;是否漏水 可移植性&#…

Redis基础特性及应用练习-php

redis持久化&#xff08;persistence&#xff09; redis支持两种方式的持久化&#xff0c;可以单独使用或者结合起来使用。 第一种&#xff1a;RDB方式&#xff08;redis默认的持久化方式&#xff09; rdb方式的持久化是通过快照完成的&#xff0c;当符合一定条件时redis会自…

Ansible playbook简介与初步实战,实现批量机器应用下载与安装

一.Ansible playbook简介 playbook是ansible用于配置&#xff0c;部署&#xff0c;和管理被节点的剧本通过playbook的详细描述&#xff0c;执行其中的一些列tasks&#xff0c;可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list&…

webpack(四)plugin

定义 和loader的区别 loader:文件加载器&#xff0c;能够加载资源&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中。plugin:赋予了webpack各种灵活的功能&#xff0c;例如打包优化、资源管理、环境变量注入等&…

【c++ debug】cmake编译报错 No such file or directory

1. 报错&#xff1a;error while loading shared libraries: libprotoc.so.24: cannot open shared object file: No such file or directory 问题原因&#xff1a;找不到动态库 解决方法&#xff1a;添加动态库路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/your/protobuf/l…

企业架构LNMP学习笔记18

nginx的日志&#xff1a; 日志类型&#xff1a; access.log 访问日志、查看统计用户的访问信息&#xff0c;流量。 error.log 错误日志&#xff0c;错误信息&#xff0c;重写信息。 access.log日志文件内容示例&#xff1a; 192.168.17.1 - - [06/Sep/2023:20:37:39 0800] …