RESTful API设计指南:构建高效、可扩展和易用的API

news2024/11/15 10:53:19

文章目录

  • 引言
  • 一、RESTful API概述
    • 1.1 什么是RESTful API
    • 1.2 RESTful API的重要性
  • 二、RESTful API的基本原则
    • 2.1 资源导向设计
    • 2.2 HTTP方法的正确使用
  • 三、URL设计
    • 3.1 使用名词而非动词
    • 3.2 使用复数形式表示资源集合
  • 四、请求和响应设计
    • 4.1 HTTP状态码
    • 4.2 响应格式
      • 4.2.1 响应实体信息
      • 4.2.2 响应列表格式
      • 4.2.3 响应分页格式
    • 4.3 使用 HATEOAS 导航到相关资源
    • 4.4 错误处理
  • 五、URI 版本管理
    • 5.1 常见的版本控制策略
    • 5.2 如何选择
  • 六、数据筛选和分页
    • 6.1 分页和过滤
  • 总结

在这里插入图片描述

引言

在当今互联网时代,应用程序和服务之间的通信变得越来越重要。随着移动设备的普及、云计算的发展以及物联网的兴起,我们需要一种灵活、高效且易于理解的方式来设计和实现这些通信接口。RESTful API应运而生,成为了现代软件架构中不可或缺的一部分。

一、RESTful API概述

images (2)

1.1 什么是RESTful API

RESTful API(Representational State Transfer API),中文翻译过来可以表述为表述性状态转移,是一种基于HTTP协议的网络应用程序接口风格。它遵循REST架构风格的约束条件和原则,以资源为中心,使用标准的HTTP方法(如GET、POST、PUT、DELETE等)来执行操作。RESTful API强调简单性、可扩展性和可读性,使得不同系统之间的通信变得更加直观和高效。

1.2 RESTful API的重要性

RESTful API在现代软件开发中扮演着关键角色,其重要性体现在以下几个方面:

  1. 标准化:RESTful API遵循统一的设计原则,使得不同开发团队和系统之间的集成变得更加容易。
  2. 可扩展性:基于资源的设计使得API能够轻松地适应新的需求和功能扩展。
  3. 简单易用:RESTful API的设计理念使得接口更加直观,降低了开发者的学习成本。

本文旨在提供一个RESTful API设计指南,帮助开发人员构建高效、可扩展和易用的API。我们将介绍RESTful API设计的原则、最佳实践和模式,并提供一些实用的技巧和示例。通过遵循这些指南,开发人员可以设计出易于理解、易于使用和易于维护的API。

二、RESTful API的基本原则

2.1 资源导向设计

资源是RESTful API的核心概念。每个资源都应该有一个唯一的标识符(通常是URL)。设计API时,应该围绕资源而不是动作来组织。例如,一个用户资源可能表示为 /users/{id}

2.2 HTTP方法的正确使用

RESTful API利用HTTP方法来表示对资源的操作,常用的有下面几种:

  • GET(SELECT):获取资源
  • POST(CREATE):创建新资源
  • PUT(UPDATE):更新现有资源
  • DELETE(DELETE):删除资源
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。

范例:

GET 		/users  // 获取用户列表
POST 		/users  // 创建新用户
PUT 		/users/{userId} //获取指定ID的用户信息
PUT 		/users/{userId}  // 更新指定ID的用户信息
DELETE 		/users/{userId}  // 删除指定ID的用户
PATCH 		/users/{userId}  // 更新指定ID用户的部分信息

除此之外还有两种:

  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

三、URL设计

3.1 使用名词而非动词

URL应该表示资源,而不是动作。使用HTTP方法来表示动作。

范例:

  • GET /articles
  • POST /articles

避免:

  • GET /getArticles
  • POST /createArticle

3.2 使用复数形式表示资源集合

对于资源集合,使用复数形式更为直观。

范例:

  • GET /users
  • GET /users/{id}

避免:

  • GET /user
  • GET /user/{id}

四、请求和响应设计

4.1 HTTP状态码

HTTP状态码是表示请求结果的标准方式。正确使用状态码可以提高API的可读性和一致性。

HTTP状态码范围:

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常用状态码:

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:
        用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
502 Bad Gateway - [*]:服务器作为网关或代理,从上游服务器收到无效响应。
503 Service Unavailable - [*]:服务器当前无法处理请求,可能是由于过载或维护。
504 Gateway Timeout - [*]:服务器作为网关或代理,没有及时从上游服务器收到响应。

根据具体情况选择适当的状态码,避免滥用200状态码来表示所有情况。

4.2 响应格式

请求响应传输数据格式:JSON,JSON数据尽量简单轻量,避免多级JSON的出现。

4.2.1 响应实体信息

{
  code: 200,
  msg: "success",
  data: {
    entity: {
      id: 1,
      name: "XXX",
      code: "XXX"
    }
  }
}

4.2.2 响应列表格式

{
  code: 200,
  msg: "success",
  data: {
    records: {
      entity: {
        id: 1,
        name: "XXX",
        code: "XXX"
      },
      entity: {
        id: 2,
        name: "XXX",
        code: "XXX"
      }
    }
  }
}

4.2.3 响应分页格式

{
  "msg": "success",
  "code": 200,
  "data": {
    "current": 0,
    "records": [{
        id: 1,
        name: "XXX",
        code: "H001"
      },
      {
        id: 2,
        name: "XXX",
        code: "H001"
      }
    ],
    "size": 5,
    "total": 2
  }
}

分析:

  • data: 数据主体,包含了分页信息和记录列表。
    • current: 当前页码,这里的值为 0,表示第一页(具体按照公司规范)。
    • records: 记录列表,包含了当前页的所有记录,每个记录包含 idnamecode 字段。
    • size: 每页大小,这里的值为 5,表示每页最多显示5条记录。
    • total: 总记录数,这里的值为 2,表示一共有2条记录。

4.3 使用 HATEOAS 导航到相关资源

REST 背后的主要动机之一是它应能够导航整个资源集,而无需事先了解 URI 方案。 每个 HTTP GET 请求应通过响应中包含的超链接返回查找与所请求的对象直接相关的资源所需的信息,还应为它提供描述其中每个资源提供的操作的信息。 此原则称为 HATEOAS 或作为应用程序状态引擎的超文本。

由于当前没有如何为 HATEOAS 原则建模的任何通用标准,因此此部分的示例仅作为一个可能的参考。

例如,若要处理订单与客户之间的关系,可以在订单的表示形式中包含链接,用于指定下单客户可以执行的操作。 下面是可能的表示形式:

{
  "orderID":3,
  "productID":2,
  "quantity":4,
  "orderValue":16.60,
  "links":[
    {
      "rel":"customer",
      "href":"https://adventure-works.com/customers/3",
      "action":"GET",
      "types":["text/xml","application/json"]
    },
    {
      "rel":"customer",
      "href":"https://adventure-works.com/customers/3",
      "action":"PUT",
      "types":["application/x-www-form-urlencoded"]
    },
    {
      "rel":"customer",
      "href":"https://adventure-works.com/customers/3",
      "action":"DELETE",
      "types":[]
    },
    {
      "rel":"self",
      "href":"https://adventure-works.com/orders/3",
      "action":"GET",
      "types":["text/xml","application/json"]
    }
  ]
}

在此示例中,links 数组包含一组链接。 每个链接表示可对相关实体执行的操作。 每个链接的数据包含关系 (“customer”)、URI (https://adventure-works.com/customers/3)、HTTP 方法和支持的 MIME 类型。 这是客户端应用程序在调用操作时所需的全部信息。

links 数组还包含有关已检索的资源本身的自引用信息。 这些链接包含关系 self

4.4 错误处理

错误响应应包含:

  • HTTP状态码
  • 错误消息
  • 错误代码(可选)
  • 详细说明(可选)

例如:

{
    "code": "50x",
    "message": "The provided email address is invalid"
}

五、URI 版本管理

5.1 常见的版本控制策略

  1. URI 路径版本控制
    例如:/api/v1/users
  2. 查询参数版本控制
    例如:/api/users?version=1
  3. 自定义 HTTP 头版本控制
    例如:Accept-version: v1
  4. Accept 头版本控制
    例如:Accept: application/vnd.myapp.v1+json

5.2 如何选择

选择版本控制策略时,还应考虑对性能的影响,尤其是在 Web 服务器上缓存时。 URI 路径版本控制和查询参数版本控制方案都是缓存友好的,
因为同一 URI/查询字符串组合每次都指向相同的数据。

自定义 HTTP 头版本控制和Accept 头版本控制机制通常需要其他逻辑来检查自定义标头或 Accept 标头中的值。 在大型环境中,使用不同版本的
Web API 的多个客户端可能会在服务器端缓存中生成大量重复数据。 如果客户端应用程序通过实现缓存的代理与 Web 服务器进行通信,并且该
代理在当前未在其缓存中保留所请求数据的副本时,仅将请求转发到 Web 服务器,则此问题可能会变得很严重。

六、数据筛选和分页

6.1 分页和过滤

对集合资源执行的 GET 请求可能返回大量的项。 应将 Web API 设计为限制任何单个请求返回的数据量。 请考虑支持查询字符串指定要检索的最大项数和集合中的起始偏移量。

  • 分页:

    • 使用 limit 和 offset 参数
    • 或者使用基于游标的分页
  • 过滤:

    • 允许客户端指定过滤条件
    • 使用查询参数进行过滤
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100&status=active:指定第几页,以及每页的记录数,相应数据的状态。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件

总结

设计高质量的 RESTful API 是一个持续的过程。通过遵循本指南中的原则和最佳实践,你可以创建出高效、可扩展且易于使用的 API。记住,优秀的 API 设计不仅能提高开发效率,还能为你的产品或服务创造更大的价值。如要想要获取更多参考范例,可以参考Github的API接口,Github使用的就是RESTful API,希望本文对大家有所帮助😊。


参考文章:

RESTful Web API 设计

HTTP状态码

GitHub REST API 文档

RESTful API 设计指南——阮一峰

在这里插入图片描述

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

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

相关文章

新能源汽车空调系统的四个工作过程

汽车空调制冷系统组成 1.汽车空调制冷系统组成 以R134a为制冷剂的汽车空调制冷系统主要包括压缩机、电磁离合器、冷凝器、 散热风扇、储液于燥器、膨胀阀、蒸发器、鼓风机、制冷连接管路、高低压检测 连接接头、调节与控制装置等组成。 汽车空调的四个过程 1压缩过程 传统车…

nginx的access.log日志输出请求总数、QPS和平均带宽

适用格式 #log_format main $remote_addr - $remote_user [$time_local] "$request" # $status $body_bytes_sent "$http_referer" # "$http_user_agent" "$http_x_forwarded_for"; 形如&#…

差分进化算法原理及其MATLAB/Python代码

1.算法简介 引用自:Storn R, Price K. Differential evolution–a simple and efficient heuristic for global optimization over continuous spaces[J]. Journal of global optimization, 1997, 11: 341-359. 今天给大家带来的是一个非常经典的智能优化算法–差分…

buu做题(6)

目录 [GWCTF 2019]我有一个数据库 [WUSTCTF2020]朴实无华 [GWCTF 2019]我有一个数据库 什么都没有, 尝试用dirsearch扫一下目录 可以扫到一个 /phpmyadmin 可以直接进入到数据库里面 但里面没什么东西 可以看到它的版本不是最新的, 搜一下相关的漏洞 phpMyAdmin 4.8.1后台文…

OCR识别采购单小程序管理助手

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

nodejs学习之process.env.NODE_ENV

简介 process对象是 Node 的一个全局对象,提供当前 Node 进程的信息。它可以在脚本的任意位置使用,不必通过require命令加载。该对象部署了EventEmitter接口。 process.env 属性返回包含用户环境的对象 使用 pnpm init新建index.js const { env } r…

在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU

本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…

linux系统下,matplotlib无法显示中文字体的解决办法

1.查看自己系统是否安装了中文字体 看是否有这个目录,如果没有的话,则进行安装 2.安装中文的字体 sudo apt-get install ttf-wqy-zenhei3.测试matplotlib进行显示中文字体 from matplotlib.font_manager import FontProperties font FontProperties…

什么?突降福利假日——Windows全球蓝屏!

在科技界,任何大型软件公司的产品出现问题都可能成为头条新闻,而当这个问题是“蓝屏死机”(Blue Screen of Death, BSOD),并且影响范围覆盖全球时,其影响力更是无法估量。 近日,微软公司就经历了一场史无前例的全球性蓝屏事件,这一事件不仅考验了微软的技术应对能力,也…

员工泄密公司资料起诉有用吗或者用什么软件管控防止

员工泄密公司资料时,公司采取法律行动起诉员工确实是一种有效的应对方式,尤其是当泄密行为对公司造成了显著的经济或名誉损失时。 因为法律有专门的条款规定。 法律界定 民事责任 当员工泄密对公司造成经济损失时,公司可以依据《中华人民共…

pytorch的17个Loss和10个优化函数

pytorch的17个Loss和10个优化函数 一、 17个Loss 函数二、10个优化器 一、 17个Loss 函数 二、10个优化器 开始:

C#定时发送邮件功能

C#定时发送邮件功能 背景 自动运维监控客户端在自动关闭时,需要给实施同学发送提醒邮件。支持163邮箱、qq邮箱、火狐邮箱等各种通用邮箱。 定时器发送邮件 代码 邮件功能模块 using ITSLog.LogManage; using System; using System.Collections.Generic; using…

FLINK-运行架构

为什么要学习Flink运行架构? 虽然现在大厂的开发工具都非常高效、只需要进行参数配置、Flink-sql写业务逻辑,但是在资源配置逻辑优化上不可避免需要了解底层的组件配置。面试时可能也会被问到FLINK是如何进行资源分配、作业运行的等。 以下是在学习时记录…

【一刷《剑指Offer》】面试题 34:丑数

力扣对应题目链接:264. 丑数 II - 力扣(LeetCode) 牛客对应题目链接:丑数_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》对应内容 二、分析题目 根据题意,每个丑数都可以由其他较小的丑数通过乘以 2 或 3 或 5 …

C++字体库开发之fontconfig使用五

代码 #include <cassert> #include <algorithm> #include "fontconfig/fontconfig.h" #include <stdexcept> #include <iostream>#define HAS_FALLBACK_CONFIGURATIONenum FontStyle : uint16_t {Regular 0,Italic 0x01,Bold 0x02, };en…

如何在 Mac 上恢复丢失或删除的文件

也许您放错了 Mac 上的某个文件&#xff0c;或者永久删除了现在需要的文件。根据您丢失或删除文件的时间&#xff0c;有多种方法可以恢复 MacOS 上的项目。 我们从最快、最简单的方法开始&#xff0c;然后逐渐采用更耗时或更昂贵的方法来恢复 Mac 上的文件、文件夹和其他项目。…

MySQL添加索引时会锁表吗?

目录 简介Online DDL概念Online DDL用法总结 简介 在MySQL5.5以及之前的版本&#xff0c;通常更改数据表结构操作&#xff08;DDL&#xff09;会阻塞对表数据的增删改操作&#xff08;DML&#xff09;。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行&#xff0c;降低…

CentOS 7 yum官方源失效

问题 2024年7月&#xff0c;官方对centos 7停止了维护&#xff0c;yum的源网址mirror.centos.org也已经无法访问。 在此情况下&#xff0c;无法正常使用yum进行安装和更新工具。 在尝试了更换阿里源之后&#xff0c;仍然有部分工具库无法访问。 通用解决方案 1. 打开/etc/y…

react页面指定dom转pdf导出

1. 使用jsPDFhtml2canvas将页面转成图片然后导出2. 自定义创建iframe调用iframe.print()进行页面打印转pdf导出3. 使用react-to-print插件打印pdf4. 利用media print样式打印页面局部元素 1. 使用jsPDFhtml2canvas将页面转成图片然后导出 缺点&#xff1a;页面过长可能会导出失…

SwarmBrain: 通过大模型玩实时战略游戏《星际争霸II》

人工智能咨询培训老师叶梓 转载标明出处 实时战略&#xff08;RTS&#xff09;游戏如《星际争霸II》一直被视为测试和提升AI能力的绝佳平台。尽管基于强化学习&#xff08;RL&#xff09;的AI代理在《星际争霸II》中取得了显著进展&#xff0c;但它们在处理复杂环境时仍面临挑战…