当前位置: 首页 > news >正文

一文详解REST风格

一文详解REST风格

    • 一、REST风格的核心概念
      • 1.1 什么是REST?
      • 1.2 REST与HTTP的关系
    • 二、REST风格的核心原则
      • 2.1 资源为中心,URI表示资源
      • 2.2 用HTTP方法表示操作类型
      • 2.3 用HTTP状态码表示结果
      • 2.4 响应格式标准化
        • 2.4.1 成功响应
        • 2.4.2 错误响应
      • 2.5 无状态通信
    • 三、RESTful API设计实战案例
      • 3.1 资源定义
      • 3.2 API设计清单
      • 3.3 进阶设计:关联资源与过滤排序
        • 3.3.1 关联资源(如用户的订单)
        • 3.3.2 过滤、排序、分页
    • 四、常见误区与最佳实践
      • 4.1 误区1:过度追求“纯REST”
      • 4.2 误区2:忽略幂等性设计
      • 4.3 最佳实践

REST(Representational State Transfer,表现层状态转移)是一种被广泛采用的Web API架构风格,它并非协议或标准,而是一组设计原则,旨在通过HTTP协议天然特性构建简洁、可扩展、易于理解的API。

一、REST风格的核心概念

1.1 什么是REST?

REST由Roy Fielding在2000年的博士论文中提出,核心是**“以资源为中心”**,将一切数据(如用户、订单、商品)视为“资源”,通过HTTP方法对资源进行操作。

  • 资源(Resource):API操作的对象(如/users表示用户资源集合,/users/1表示ID为1的用户);
  • 表现层(Representation):资源的展示形式(如JSON、XML,现代API多采用JSON);
  • 状态转移(State Transfer):通过HTTP方法(GET/POST/PUT/DELETE)实现资源状态的改变,客户端无需了解服务器内部实现。

1.2 REST与HTTP的关系

REST并非独立于HTTP的技术,而是充分利用HTTP协议特性的设计风格:

  • 用HTTP方法(GET/POST/PUT/DELETE)表示操作类型;
  • 用HTTP状态码(200/201/404/500等)表示请求结果;
  • 用HTTP头(如Content-Type)表示数据格式;
  • 用URI标识资源(如/products)。

简言之:REST是“如何正确使用HTTP”的设计指南。

二、REST风格的核心原则

遵循以下原则是设计RESTful API的关键,也是区分“REST风格”与“普通API”的核心。

2.1 资源为中心,URI表示资源

  • URI应标识资源(名词),而非操作(动词);
  • 用复数表示资源集合(如/users),单数表示单个资源(如/users/1);
  • 避免在URI中包含版本号、操作动词(如/getUser/deleteOrder)。
错误URI 正确URI 说明
/getUser?id=1 /users/1 避免动词,用名词+ID表示资源
/deleteOrder/1 /orders/1 删除操作通过HTTP方法(DELETE)表示
/v1/users /users(版本放HTTP头) 避免URI包含版本号

2.2 用HTTP方法表示操作类型

HTTP方法本身具有语义,REST通过方法表示对资源的操作:

HTTP方法 操作类型 示例URI 说明
GET 查询资源 /users 查询用户列表(安全、幂等)
GET 查询资源 /users/1 查询ID为1的用户(安全、幂等)
POST 创建资源 /users 新增用户(非幂等,多次调用可能创建多个)
PUT 全量更新资源 /users/1 更新用户全部信息(幂等)
PATCH 部分更新资源 /users/1 更新用户部分信息(如仅修改姓名,幂等)
DELETE 删除资源 /users/1
http://www.dtcms.com/a/291602.html

相关文章:

  • 青少年科学世界名刊分析评介:《生物技术世界》
  • 机器学习中的数据预处理:从入门到实践
  • Spring 对数组和集合类的自动注入
  • 234、回文链表
  • 使用AI把普通的条形柱状图,丰富成“好看高大上”的条形柱状图
  • 解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题
  • PyQt5—QInputDialog 学习笔记
  • 印度给巴铁断水,中国悄然开建雅鲁藏布江水电站,纯属巧合!
  • Python 标准库之 os 模块全面讲解
  • 大模型为什么出现幻觉?
  • 在Anolis8.6上源码编译安装部署OpenVAS(GVM)未完待续
  • 华为云CCE-PV使用OBS存储类之坑
  • Android NDK ffmpeg 音视频开发实战
  • 语义化版本规范(SemVer)
  • 【计算机组成原理】符号位OF、ZF、CF、SF详解
  • c语言 进阶 动态内存管理
  • stream event
  • Playwright-MCP浏览器会话复用全解析
  • swiper js无缝滚动---解决播放总是有间隔、动画一闪一跳的问题
  • 3.组合式API父子通信
  • 【免费版】开启 Youtube 双语字幕
  • 神经网络——非线性激活
  • Java学习-----AIO模型
  • STM32小实验四--按键控制LED灯
  • tar 解压:Cannot change ownership to uid 1000, gid 1000: Operation not permitted
  • 2021-06-27 51单片机外部中断0控制数码管0自增到9
  • 知识之镜:当检索生成照见人类认知的深渊
  • C++ 分配内存释放内存
  • LinkedList的模拟实现(双向链表Java)
  • JavaScript的引入方式和基础语法的快速入门与学习