RESTful API设计规范实战:从资源建模到状态码的接口落地指南

RESTful API设计规范接口设计资源建模
于 2026-10-01 03:56:22 修改
·本内容遵循CC 4.0 BY-SA版权协议

最近在团队里做接口评审,看了将近一个月的新老接口实现,越来越觉得"RESTful API 设计规范"这句话不能只停留在概念层面。我见过太多接口,名字叫 getUserInfo、getNewsList,一堆 POST 请求干着 GET 的活儿,状态码永远是 200,返回体外面再套一层 {code: 200, message: "success", data: {...}}。前后端联调的时候,光"这次返回结构又变了吗"就能扯半天。

这篇东西不是教科书式的理论复述,是我自己写接口、评接口、被接口坑过之后攒出来的实操规范。不追求"纯正 REST"的原教旨主义,只求一条:让接口可读、可维护、可演进,合作的人不需要翻源码就能猜个八九不离十。适合刚接触接口设计的新人照着落地,也适合团队内部做代码评审的时候当一把"尺子"用。

1. 先给接口诊断:那些让我血压升高的"野路子"写法

要谈规范,先得知道不规范长什么样。接口这东西,写的时候谁都觉得自己的命名挺清楚,但过三个月再看,或者换个人接手,问题全冒出来了。下面几种是我在评审时遇到频率最高的。

1.1 命名混乱:URL 里长出了动词和大小写

最常见的病根,是把后端接口当成"函数调用"来设计。比如:

TEXT
POST /api/deleteUser
POST /api/getOrderInfo
POST /api/userLogin
POST /api/getUserOrderList

一眼看过去,每个 URL 都像一个方法名。问题在于:URL 里塞了动词,资源的含义被稀释了,前端调用的时候完全依赖后端给的"接口清单",没有规律可循。今天心情好叫 getUserOrderList,明天重构一下改成 fetchUserOrders,前端就得跟着改一遍。

还有一类是大小写和分隔符混用:

TEXT
/api/userInfo
/api/user-info
/api/user_info

同一个团队里三种风格并存,看着就头疼。URL 本质上是给人读的标识符,它应该稳定、统一、有规律。混用连字符和下划线看起来是小事,但对使用方来说是实打实的认知负担。

1.2 全 POST + 状态码永远 200 的"万能接口"

有的项目里,不管查列表、查详情、删数据、改状态,全部 POST。原因也听过,说"POST 什么都能传,最方便"。方便是方便了,后果是:

  • 缓存系统完全失效,相同的查询请求每次都打满后端;
  • 浏览器、网关、日志系统的语义判断全部失灵;
  • 谁也不知道这个接口到底安不安全、幂不幂等,排查问题全靠猜。

配合着来的是状态码全 200。业务失败就返回 {"code": 500, "message": "服务器开小差"},HTTP 状态码永远是 200。前端拿到响应要先看 code 是不是 200,不是就弹个错。这套路不能说完全错,问题在于把 HTTP 层的语义全丢光了。网关监控看所有接口都健康,实际上内部错误一大堆,报警体系形同虚设。

1.3 响应结构随意变,前端拿命猜字段

接口字段命名不一致也很致命。有的接口返回 createTime,有的返回 created_at,有的返回 ct,同一个字段三种叫法。前端的 TypeScript 类型定义得跟着改三遍,改错了线上直接白屏。

更离谱的是同一接口不同情况返回不同的结构:正常时 data 是数组,空数据时 data 是 {list: []},异常时 data 直接是 string。前端每次取值之前都得"健壮性判断",业务代码里全是 Array.isArray、typeof 的防御逻辑。这种接口,写的人爽了,用的人天天想骂人。

这些问题的根源,不是技术不行,是缺一套默认大家都遵守的设计约定。规范的意义不是限制发挥,是让接口设计变成一件"有套路、可预期"的事。

2. 把资源想清楚:URL 设计才是 REST 的根基

RESTful API 设计规范里我最看重的,是"资源"这个思维模型。简单说,你的系统里有哪些"东西",就为每个"东西"设计一组端点。用户是资源,订单是资源,文章是资源;"删除用户"这种动作不是资源,它是对用户资源的某种操作。

2.1 资源用名词,单数还是复数?选一个并坚持

资源命名第一原则:URL 里用名词,不用动词。查询一个订单信息,应该是 GET /orders/123,而不是 GET /getOrder?id=123。"获取"这个动作已经包含在 HTTP 方法里了,没必要在 URL 里再说一遍。

单数和复数的问题,业界没有绝对标准。我个人建议统一用复数:/users、/orders。理由有两个:

  • 集合语义清晰,GET /users 表示"用户集合",GET /users/1 表示"集合中的一个",层级关系一目了然;
  • 很多 REST 框架和生成文档的工具默认按复数资源生成,团队协作时惯例比偏好更重要。

我见过某团队用单数 /user,代码里有些地方拼成了 /users,前端"差一个 s"找半天 bug。规范的目的就是消灭这种无意义的差异,选哪个不重要,统一才重要。

2.2 嵌套层级别贪深,子资源关联用查询参数

常见需求:查询某个用户的所有订单。两种写法:

TEXT
GET /users/123/orders
GET /orders?user_id=123

这两种都不算错。嵌套写法的优势是层级清晰;查询参数写法的优势是资源扁平、更灵活,比如同时按用户和状态过滤时直接拼参数。在实际项目中,我建议嵌套控制在两层以内,超过两层就要警惕。

举例,/users/123/orders/456/items/789 这种三层嵌套,既难读又难维护。真需要"某个订单项"的详情时,不如直接 GET /orders/456,或者 GET /order-items/789,让每个资源尽量独立。嵌套本质上是表达"归属关系",层级多了,这种归属关系就变成负担了。

关联资源还有一种常见场景:用户和用户的收货地址。可以 /users/123/addresses,也可以 /addresses?user_id=123。我的习惯是:以主导资源为核心的归属查询用嵌套,跨资源的过滤查询用查询参数。新闻列表按分类过滤就是 GET /articles?category=tech,不要把分类做成 /categories/tech/articles,除非你确实需要一个独立的"分类"资源端点。

2.3 非资源语义的操作:用子资源或动作端点

有些操作确实不是增删改查能表达的,比如"点赞""发布""下单""取消订单"。第一反应别急着发明 POST /doLike 这种动词 URL,先想想能不能用资源操作表达。

"用户对文章点赞",本质是创建一个"点赞关系"资源:

TEXT
POST /articles/123/like # 不推荐,动词在 URL 里
PUT /articles/123/likers # 推荐,幂等:重复点赞不会产生多条记录
DELETE /articles/123/likers/me

以 likers(点赞者集合)为资源,用户点赞就是"把自己放进集合",取消就是"把自己移出集合",语义干净且天然幂等。类似的还有关注、收藏、加购物车。

有些动作确实找不到资源模型,比如"批量审核通过"。这种我建议单独建一个动作端点,顺便把它当子资源处理:

TEXT
POST /reviews/batch-approve

允许出现少量动作端点,但要控制数量。如果系统里全是动词 URL,说明资源建模这一步没做好,先回头重新理数据关系,别急着写代码。

3. 状态码不是摆设:用对 2xx/4xx/5xx 能省一多半扯皮

这是我最想吐槽的点。HTTP 状态码设计出来就是干这个的,结果很多团队只认 200、500 两兄弟。状态码用得越准,前后端沟通成本越低,监控报警越灵敏。

3.1 别再搞"200 万能响应包"了,HTTP 状态码和业务码要分家

我理解"200 万能包"的初衷:有些老系统的网关、前端框架只认 200,你返回 400 可能被拦截。但这不是接口层该背的锅,是框架配置的问题。

正确做法是:HTTP 状态码表达"这次请求在 HTTP 层面成功还是失败",业务码放在响应体里表达"业务上是什么结果"。这俩互不替代,也不该混着用。

想象一个场景:用户下单时余额不足。HTTP 返回 200、业务码 40001,还是 HTTP 返回 402、业务码 40001?我在线上见过两种极端:

  • 全部 HTTP 200,网关监控永远健康,实际业务错误率 30%;
  • 全部按 HTTP 语义返回,前端每个接口都要写全局错误拦截,业务码反而没人在乎。

实际落地方案是:HTTP 状态码负责粗粒度(请求成功、参数错、未授权、服务器内部错误),响应体里的业务码负责精确到具体错误。比如"余额不足"本质是"请求被拒绝",HTTP 用 200 和 400 都说得通,但我倾向于:参数校验类的用 4xx(400、422),业务逻辑拒绝类的 HTTP 用 200 配合业务码,因为这类错误对 HTTP 层来说是"请求已经正确处理完毕",只是业务上没有通过——具体怎么选,团队内部必须达成一致,不要今天这个明天那个。

关键不是"必须用哪种",而是定下来哪种,并且让前端知道分类规则。我现在的项目采用的就是"HTTP 语义 + 业务码补充"的双层结构,前端全局拦截只处理 HTTP 4xx/5xx 和特定业务码,其他业务码走各自的业务分支,非常清爽。

3.2 常见场景状态码对照表

实践下来,真正高频用到的状态码并不多,我整理成一张对照表,直接贴在规范文档里:

场景 HTTP 状态码 说明
查询成功 200 OK 列表、详情
创建成功 201 Created 返回 Location 头或 body 里的 id
创建或更新成功,但服务端不返回 body 204 No Content 删除、改状态常用
请求参数缺失或格式错误 400 Bad Request 必填没传、类型不对
未认证 401 Unauthorized 没带 token 或 token 过期
无权限 403 Forbidden 认证过了但没权限
资源不存在 404 Not Found 包括"id 不存在"和"URL 本身不存在",统一 404 防止信息泄露
请求方法不对 405 Method Not Allowed 比如只允许 GET 的端点收到了 DELETE
参数语义错误 422 Unprocessable Entity 参数格式对但业务上不合法,如未来日期
服务器内部异常 500 Internal Server Error 未知异常
服务不可用 503 Service Unavailable 限流、依赖组件故障

有个容易忽略的细节:资源不存在和权限不足,都建议返回 404。直接告诉别人"这个订单不存在"比告诉他"这个订单存在但你无权访问"安全得多,防止接口被用来探测资源。

3.3 你以为没用、其实很有用的 304 和 206

除了上面这些,还有两个状态码值得用起来:

  • 304 Not Modified:配合 If-None-Match 或 If-Modified-Since 做缓存验证。列表接口、配置接口加上它,可以让客户端在响应没变化时直接复用本地缓存,大幅减少带宽。做法也不复杂:后端在生成响应时算一个 ETag,前端请求时带上 If-None-Match,后端判断没变化直接返回 304 空 body。我在配置中心接口上加了这层,一个月带宽省了一半。
  • 206 Partial Content:配合 Range 头做断点续传、大文件分片下载。做文件下载、音视频播放的接口一定会碰到。

这两个状态码属于"平时用不上,用上就是高光时刻"的类型,但设计接口时提前考虑缓存和范围请求,能让接口的适用面宽很多。

4. 请求侧的设计细节:方法选择、幂等、分页过滤排序

URL 确定之后,请求怎么发、参数怎么传,同样有一堆讲究。这部分做得好,接口用起来舒服;做得不好,前端天天跟后端吵架。

4.1 POST/PUT/PATCH 的选择题:幂等是核心判据

HTTP 方法不只是"动词选择",它携带了三个关键语义:是否幂等、请求体是否有意义、是否可缓存。

  • GET:查询,无请求体(特殊场景除外),幂等,可缓存。
  • POST:新建"不可寻址"的资源,不幂等,通常不可缓存。注意:POST 不要求幂等,所以同一个请求发两次会产生两条数据,下单接口要有防重机制,这是另一个话题。
  • PUT:整体替换资源,幂等,完整资源。比如更新用户资料,PUT /users/123,body 里是完整的用户对象。
  • PATCH:部分更新资源,不要求幂等,body 里只是要改的字段。
  • DELETE:删除资源,幂等。删除不存在的资源,返回 404 还是 204?我建议返回 204 或 404 都行,但要在规范里明确;如果"删除一个不存在的 id"希望客户端能感知到,用 404 更明确。

实操里最常见的坑是:更新一个字段用了 PUT,却只传了要改的字段。PUT /users/123 传 {name: "新名字"},结果用户的其他字段(头像、简介)全部被置空或丢失,因为 PUT 的语义是"用 body 整体替换"。遇到这种场景,要么用 PATCH 传部分字段,要么 PUT 时让前端传完整对象。两者选一,不要混搭,这是数据安全层面的问题。

4.2 分页、过滤、排序参数:约定俗成比自定义更好用

列表接口基本离不开分页。参数命名建议直接沿用业界通行惯例,减少使用方学习成本:

参数 约定 说明
页码 page(从 1 开始) 简单直观,适合中小数据量
每页条数 page_size 或 limit 建议设上限,如最大 100
偏移量 offset 适合大数据的游标场景,但和 page 别混用
游标 cursor 适合高频写入、数据不断变化的列表
排序字段 sort=created_at 字段白名单校验,防止注入
排序方向 order=desc 默认 desc 或 asc,按业务习惯

分页有两种主流:offset/limit 和 cursor。数据量小、变动少,用 page/page_size 就行;数据量大、实时插入多,用 cursor 游标分页,避免"翻到第 50 页时前面删了一条,导致重复或漏数据"。游标设计时注意是模糊的透传值,不要让客户端自己拼。

过滤参数我习惯用查询参数表达:GET /orders?status=paid&created_at_from=2024-01-01。注意:from/to 这种复合参数比 created_at_start_time 短一半,但还是建议团队内统一用 _from/_to 后缀,并且做参数白名单校验,别把数据库字段名直接暴露在 URL 里。

排序参数同理,sort 的值必须和服务端白名单比对,避免前端把任意字段拼进排序条件,既防注入又防性能问题。排序加在 updated_at 上可能没问题,但加在 text 这种大字段上就是灾难。

4.3 字段选择、批量查询、搜索:列表接口的三大进阶需求

  • 字段选择(sparse fieldsets):GET /articles?fields=id,title,published_at。当某个资源字段特别多(比如文章正文全文、JSON 配置等),允许客户端指定只要哪些字段,能大幅降低响应体积和前端解析成本。实现上就是后台把返回对象白名单化。
  • 批量查询:GET /articles?id=1,2,3 或 POST /articles/batch_get。REST 本身推荐用查询参数逗号分隔,但 id 一多 URL 就超长。我自己的经验:少量 id 用 GET 逗号分隔,大量 id 或带复杂条件用 POST 批量查询端点。这类端点数量要控制在个位数,不能每个资源都搞一个。
  • 搜索:简单搜索直接 ?q=keyword 走列表接口;复杂搜索(多条件、相关性排序、高亮)建议独立建 /search 端点。不要把搜索塞进列表接口强行判断 q 参数存在与否,逻辑里全是分支,后面维护的人想骂人。

5. 响应体长什么样:统一包装到底是省事还是挖坑

响应结构是接口设计里最容易吵起来的部分。核心争议集中在:要不要统一包一层 {code, message, data}?我的态度是:统一包装可以有,但必须约定清楚"什么时候包、包什么",别把所有语义都塞进自定义 code。

5.1 统一响应格式的取舍:规范三要素

我见过两种极端方案:

  • 方案 A:纯 REST 语义,响应体就是资源本身,无包装。API 处女座的最爱,但业务错误、分页信息都得塞 HTTP 头或额外字段,前端用起来费劲。
  • 方案 B:无论成功失败,全包 {code, message, data}。前端确实好判断,但 HTTP 状态码变成装饰品,监控全废。

现实世界的折中是"分场景定义":

  • 查询、创建、更新成功的响应:data 直接是资源或资源列表,不加壳。
  • 需要加分页信息:包一层 {items, total, page, page_size},这是唯一需要"壳"的场景。
  • 业务错误:统一格式 {code, message, details},HTTP 状态码按错误类型返回。

拿订单列表举例,成功时:

JSON
{
"items": [...],
"total": 1024,
"page": 1,
"page_size": 20
}

失败时:

JSON
{
"code": "INSUFFICIENT_BALANCE",
"message": "余额不足,还差 30 元",
"details": {
"required": 130,
"current": 100
}
}

统一的是"错误格式",不是"所有响应的壳",这样既保留 HTTP 语义,前端又不会因为结构多变而抓狂。

5.2 错误码和错误信息设计:机器可读,人类可懂

错误码别用纯数字,纯数字没法从日志里一眼看出含义,前端 switch 起来也麻烦。我建议用大写蛇形字符串,比如 INVALID_PASSWORD、ORDER_NOT_FOUND、RATE_LIMITED。这样日志检索、前端映射、后续兼容都比数字友好。

错误信息 message 要写给"调用方的用户"看,而不是贴异常堆栈。后端拿 try-catch 捕获异常后,不要直接返回 exception.getMessage(),那种"NullPointerException at xxx line 123"的消息用户根本看不懂。message 应该是能直接展示给终端用户的一句话,details 里再放机器可读的结构化数据,比如校验失败的字段列表。

常见错误码示例:

错误码 HTTP 状态码 场景
INVALID_PARAMETER 400/422 参数错误,details 可带字段明细
UNAUTHORIZED 401 未认证或 token 过期
FORBIDDEN 403 无权限执行该操作
NOT_FOUND 404 资源不存在
CONFLICT 409 状态冲突,如重复操作
RATE_LIMITED 429 请求过于频繁
INTERNAL_ERROR 500 未知异常,message 给通用提示

错误信息里不要暴露敏感信息:SQL 语句、文件路径、堆栈信息都不该出现在响应体中,只进服务端日志。线上踩过的坑:某接口报错直接把 MySQL 的表名字段名全返回给前端了,等于给攻击者递了一份结构图。

5.3 时间格式、ID 类型、属性命名:细节决定体验

  • 时间格式统一用 ISO 8601:2024-05-20T10:30:00Z。不要有的接口返回时间戳、有的返回 YYYY-MM-DD HH:mm:ss。时间戳数字对不同时区开发者都不友好,ISO 8601 带时区信息,前端直接用,解析无歧义。
  • ID 类型统一:如果主键是数字,全用数字;如果用了 UUID/雪花 ID,全用字符串。最怕同一个系统里 orderId 一会儿是 12345,一会儿是 "a1b2c3...",前端类型定义直接崩。
  • 属性命名统一 camelCase:JSON 序列化时保持代码风格一致,前端也少做一层转换。注意:如果用了某些数据库下划线命名,序列化层要自己映射,别让下划线字段直接露给客户端。
  • null 和空数组的意义要区分:列表接口空数据返回 [],不要返回 null;可选字段无值返回 null,不要返回 "" 或省略字段。三者混用会让前端的判空逻辑变成灾难。规范里必须写明。

6. API 会老,但接口不能乱改:版本管理与兼容策略

接口一旦上线,就有人依赖它。改接口是所有后端最头疼的事,尤其当你不知道谁在调、用的什么参数时。版本管理是给接口留一条退路,让大家敢迭代。

6.1 版本放 URI 还是 Header?我的取舍

两种主流方案:

  • URL 版本:/v1/users,/v2/users
  • Header 版本:Accept: application/vnd.myapp.v1+json

URL 版本的好处是直观,任何人打开网络面板或文档都能看到当前调的是哪个版本,调试、日志、排查成本低。缺点是 URL 被版本号污染,但我觉得这对绝大多数业务系统都不是问题。

Header 版本的好处是 URL 干净、同一套资源可以同时支持多版本,但调试极度不方便,网关层要解析 Accept 头,前端还得保证每个请求都带对头。我自己的观点:面向外部开放的平台 API 考虑 Header 版本;内部服务、微服务间调用直接 URL 版本。大部分团队选 URL 版本就行,别把事情搞复杂。

版本号从 v1 开始,不要从 v0 开始,也不要直接不写版本让所有人都用默认版本。没有版本号的 API 一旦被大量调用,后续升级就是一场灾难。

6.2 哪些改动算破坏性变更?

破坏性变更的判断标准很简单:不升级客户端,客户端会不会出错? 只要会出错,就是破坏性变更,必须走新版本或者和调用方充分沟通。

具体来说,这些改动大概率是破坏性的:

  • 删除或重命名已有字段
  • 改变字段类型或含义(比如 total 从 int 变成 string)
  • 改变 URL 或请求方法(POST /orders 改成 PUT /orders)
  • 改变分页参数语义(page 从 0 开始改成从 1 开始)
  • 改变错误码的含义或响应结构

这些改动通常是"增强型"的,可以原地升级:

  • 新增可选字段(客户端不确定时忽略)
  • 新增接口端点(不与原有重名)
  • 扩充枚举值(除非客户端有白名单校验)
  • 放宽校验规则(把必填改成选填,要谨慎,可能影响下游数据处理)

6.3 兼容性保护的实操手段

我在团队里强推三条规则:

  1. 字段只增不改不删。新字段可以加,老字段哪怕写错了也别删,最多标注 deprecated,然后提供新字段替换。字段删除要至少等一个完整的大版本周期,不能这个月加下个月删。
  2. 用 _deprecated 或文档标注替换关系。接口文档里把废弃字段标出来,写清"请使用 xxx 字段代替",给前端足够的过渡期。在代码层可以对废弃字段打日志,统计还有多少调用方在用,数据说话,别拍脑袋下架。
  3. 保留旧版本至少 N 个版本周期。我的项目里约定:新版本发布后旧版本至少保留 6 个月或 3 个小版本,到期后通知调用方迁移,再择机下线。不要为了"整洁"立刻删旧版本,生产环境稳定性优先。

7. 我现在的接口套模板:可直接抄走的配套规范

前面聊了原则,最后给一套可以实际落地的模板。这部分是"拿来即用"的内容,也是我每次开新项目时直接复制的基底。

7.1 一个完整的接口设计示例

以电商系统的订单模块为例,看一个规范化的接口从 URL 到响应长什么样:

TEXT
# 创建订单
POST /v1/orders
Content-Type: application/json
 
{
"user_id": "u_123",
"items": [
{"product_id": "p_001", "quantity": 2}
],
"address_id": "a_456"
}
 
响应 201 Created:
{
"id": "o_789",
"status": "CREATED",
"total_amount": 199.50,
"currency": "CNY",
"created_at": "2024-05-20T10:30:00Z"
}
TEXT
# 查询订单详情
GET /v1/orders/o_789
 
响应 200 OK:
{
"id": "o_789",
"status": "PAID",
"items": [...],
"total_amount": 199.50,
"currency": "CNY",
"created_at": "2024-05-20T10:30:00Z"
}
TEXT
# 分页查询我的订单
GET /v1/orders?user_id=u_123&page=1&page_size=20&sort=created_at&order=desc
 
响应 200 OK:
{
"items": [...],
"total": 138,
"page": 1,
"page_size": 20
}
TEXT
# 取消订单
POST /v1/orders/o_789/cancel
 
订单状态机要求取消操作语义明确,不适合用 DELETE 直接删掉订单记录(数据要留痕),所以做成动作端点。
 
响应 200 OK:
{
"id": "o_789",
"status": "CANCELLED"
}

这个示例里体现了几个要点:资源复数命名、版本号在 URL、分页参数统一、状态码语义化、动作端点控制数量。照着这个模板写接口,基本不会跑偏。

7.2 接口上线前的评审检查表

每次新接口上线前,评审时过一遍这个清单,能拦住大部分问题:

检查项 说明
URL 是否只用了名词? 动词是否过多?如果是,考虑 resource 化
是否统一复数命名? 团队选定后,别今天单数明天复数
方法选择是否匹配语义? GET 绝不改数据;更新选 PUT 还是 PATCH 明确了吗
状态码用得准吗? 200/201/204/400/401/403/404/409/422 是否区分清楚
错误码是否机器可读? 不要纯数字,尽量用 NOT_FOUND 这种语义化字符串
分页参数是否统一? page/page_size 还是 cursor?文档同步了吗
时间格式是否统一? 是否统一 ISO 8601,带不带时区
响应字段类型是否稳定? null 和空数组是否语义清晰
是否做了字段白名单? sort、fields 这种参数必须服务端校验
是否考虑幂等? 创建类接口要不要加 Idempotency-Key
是否标注了 deprecated? 有废弃字段时是否提前通知

这张检查表我打印出来贴在工位旁边,评审时一个一个对。写接口的人自己先自查一遍,评审效率会高很多。

7.3 从代码层面落地的两个小建议

最后分享两个代码层面的实践心得。第一,所有接口的分页、时间格式化、错误码映射都封装成公共函数或中间件,不要把 total 和 page_size 的计算逻辑在每个接口里复制一遍,后期改分页策略时你会庆幸当初统一封装了。第二,错误处理的兜底不能省:全局异常处理器一定要有,否则任何没被你 try-catch 住的异常都会变成裸的 500,然后前端看到一堆堆栈信息,这种体验一次就够让人记住了。

接口规范本质上是团队契约,最怕的不是规范不够完美,而是每个人各写一套。把这些约定沉淀成文档、变成检查表、放进代码模板里,新同事入职一两天就能上手,而不是靠老同事口口相传"我们那边有点特殊"。这也是我在团队推这套规范的初衷:少一点惊喜,多一点可预期。

RESTful API 设计规范
本文系统阐述RESTful API设计核心原则,包括资源建模(名词导向、URI规范)、HTTP方法语义、幂等性保障、标准状态码使用及URL路径版本化策略;重点详解OpenAPI规范演进及其工程落地,涵盖Swagger2/Swagger3(SpringDoc)及Knife4j 2.x/3.x的集成配置、注解用法、访问方式与生产环境管控方案。
Dream_sky分享
908
API设计规范:RESTful API设计与OpenAPI(Swagger)完整指南
本文系统阐述RESTful API设计核心原则,包括资源建模、HTTP方法语义、状态码规范及URL设计;深入解析OpenAPI 3.0文档结构与关键对象(Info、Paths、Parameters、Schema),并覆盖Swagger UI/Editor/Codegen工具链实践、API版本控制、分页过滤、错误处理、认证机制及文档自动化方案(注解驱动与文档优先),强调规范落地与工程化协同。
七夜zippoe
874
10个RESTful API设计规范:从原则到细节的完整指南
本文系统阐述10项核心RESTful API设计规范:合理使用HTTP方法与状态码、资源导向的URL设计、统一错误响应格式、JSON数据交换、API版本控制、分页/排序/过滤支持、部分响应、HTTP缓存机制及完善文档。强调语义化、一致性与可维护性,覆盖从架构原则到工程落地的关键技术要点。
杭臣磊Sibley
894
7个黄金法则:Airbnb RESTful API设计规范实践指南
本文系统阐述Airbnb RESTful API设计规范的七大核心原则:资源命名使用复数名词、HTTP方法语义化、URL路径版本控制、统一错误响应格式、标准化分页与过滤、资源嵌套表达层级关系、一致性命名约定(kebab-case/camelCase)。内容聚焦于接口设计最佳实践,涵盖规范组成、落地配置及可扩展性支持,适用于构建高可用、易维护的Web API。
何举烈Damon
1046
Apache DolphinScheduler API 设计规范:RESTful 风格接口的 URI、Method 与参数设计实战指南
本文系统阐述Apache DolphinScheduler的RESTful API设计规范,涵盖URI资源定位(复数名词、层级路径)、HTTP Method语义映射(GET/POST/PUT/PATCH/DELETE)、路径与请求参数设计(小驼峰命名、分页约定)、基础路径/v1统一前缀,以及源码级落地验证。强调接口语义自解释性、行为可预期性与工程一致性,适用于数据编排平台API开发与治理。
霍璟尉
851
RESTful API 设计规范与实践在课设系统中的落地应用
本文从课设开发者视角出发,讲解如何将 RESTful 思维应用于中小型课设系统开发。阐述课设系统讲接口设计规范的原因,介绍 RESTful API 设计哲学、资源建模策略、统一响应结构等内容,还给出接口版本管理建议、文档工具推荐,指出常见误区及规避方法。
柚子科技
1148
RESTful API设计规范实战:从资源命名到团队落地
本文系统阐述RESTful API设计核心原则与工程落地实践,涵盖面向资源建模、URI命名规范、HTTP动词与状态码语义化使用、版本管理、统一错误响应结构、时间/ID/枚举/金额等关键字段契约约定、OpenAPI契约固化、自动化代码评审检查及典型线上事故复盘。强调无状态性、幂等性、可预期性三大工程红利,聚焦可执行、可检测、可协作的接口规范体系建设。
wx02374e436a4b8350
324
RESTful API设计规范:面向协作与生产的落地实践
本文聚焦RESTful API在协作与生产环境中的实际落地,强调资源建模优先、URL路径式版本控制、精准使用422 Unprocessable Entity等状态码、名词复数URL设计、PATCH优先更新策略、DELETE返回204、可编程错误体系、游标分页应用,以及Spring Boot下的规范实现与团队执行闭环。内容基于十年电商、SaaS、政企项目经验,直击接口设计失焦导致的协作断层与线上问题。
weixin_30861459
315
RESTful API 接口设计规范实战:从资源建模到 OpenAPI 契约落地
本文系统阐述RESTful API设计核心实践,涵盖资源建模(URL仅含名词、层级)、HTTP方法语义与幂等性、状态码规范使用(如201/429/503)、错误响应体统一结构、版本策略(路径版为主)、API Key与Token认证边界、幂等键机制、分页选型(游标vs页码)、限流三参数(配额/突发/并发)及OpenAPI契约驱动的自动化校验(Spectral lint、契约测试)。强调规范需机器可验证,而非仅文档约定。
金宇澄
187
RESTful API设计规范:从URL命名到状态码的落地实践
本文系统阐述RESTful API设计的落地实践,聚焦资源抽象、URL命名(复数名词/小写/中划线)、HTTP方法语义(GET/POST/PUT/PATCH/DELETE严格区分)、状态码合理使用(200/201/204/4xx/5xx分层表达)、错误返回统一结构、列表接口查询参数约定(过滤/排序/分页)、版本控制(路径式v1/v2)、认证安全(Bearer Token)、幂等性保障(Idempotency-Key)及规范落地工具链(OpenAPI/Spectral/Apifox)。强调资源视角替代RPC思维,提升可维护性、协作效率与基础设施兼容性。
孙玲的空间
246
深入分析 REST与RESTful API:原理、规范、工程实践与架构选型
本文系统阐述REST架构的六大强制约束、RESTful API标准化设计规范(含URI命名、HTTP状态码、响应格式),详解工程落地全流程(资源抽象、接口规约、安全加固、测试发布),并横向对比RESTful、gRPC、GraphQL等主流API架构的适用场景与技术特性,强调REST作为资源导向型通信哲学的本质及其在分布式系统中的语义统一价值。
快雪时晴-初晴融雪
3943
RESTful API设计规范完整实践指南:从资源抽象到工程落地
本文系统阐述RESTful API设计的九大核心维度:资源抽象与命名准则、HTTP方法语义化使用(GET/POST/PUT/PATCH/DELETE)及状态码规范(400/401/404/422/500等)、过滤排序分页参数设计、版本管理策略(URL路径版)、兼容性变更判定、幂等性实现、认证安全(Authorization头、HTTPS、敏感字段脱敏)、统一响应信封结构、以及规范落地机制(OpenAPI文档、接口评审、Demo先行)。聚焦工程实践,解决命名混乱、状态码滥用、分页性能差、版本失控等高频问题。
银星皓月
210
Python后端API设计规范实战:RESTful与FastAPI落地指南
本文系统阐述Python后端RESTful API设计核心规范,聚焦资源建模、URL设计、HTTP状态码语义化(如400/422/429区分)、统一错误响应体、版本控制策略及向后兼容红线。结合FastAPI落地实践,涵盖Pydantic校验、全局异常中间件、分页排序封装、API Key/JWT认证选型、限流与幂等性实现,并强调request_id全链路日志与OpenAPI文档驱动协作。
超级爱喝水
322
RESTful API设计规范:基于Python FastAPI的接口工程实践
本文围绕RESTful API核心原则展开,强调资源建模优先、URL与HTTP方法解耦、状态码语义化及幂等性保障。基于Python FastAPI框架,详细阐述URL设计规范(名词复数、无动词、层级≤2)、版本管理策略(路径带v1)、HTTP方法与状态码正确使用(如401/403区分)、以及创建接口的幂等实现。内容聚焦接口工程化落地,涵盖类型驱动开发、自动OpenAPI文档、目录结构组织等关键技术点。
趴在黄油上
256
PHP开发者必看:RESTful API设计规范落地的8个实用技巧
本文详细介绍了RESTful API设计的核心原则,包括使用标准HTTP方法、资源命名规范、状态码合理使用等内容。重点讲解了如何通过复数名词与小写字母构建一致性的URI路径,并强调避免动词污染的重要性。同时涵盖了数据格式、分页排序参数的设计及错误响应规范化等关键点,帮助PHP开发者提升API设计质量。
DeepNest
625
RESTful API设计规范:对外提供服务的标准接口
本文介绍RESTful API的设计原则与最佳实践,涵盖资源抽象、无状态通信、标准化响应及错误处理机制。重点探讨其在AI系统如anything-llm中的枢纽作用,支持鉴权、请求调度与跨平台集成,适用于个人部署与企业级应用。
csp1223
1144
RESTful API设计最佳实践:从资源建模到FastAPI落地
本文系统阐述RESTful API设计核心原则,强调资源建模而非URL风格,涵盖URI设计(名词复数、层级≤2)、HTTP方法语义化映射(GET/POST/PUT/PATCH/DELETE)、状态码规范使用(避免全200)、统一错误响应结构、Pydantic数据校验、分页/过滤/排序实现、OAuth2+JWT认证授权、版本管理策略,以及N+1查询、敏感信息防护、异步阻塞规避等常见问题排查。所有实践均基于FastAPI落地。
蝨孨槑黽
224
RESTful API设计规范:符合业界标准易于集成
本文介绍如何通过RESTful API设计规范,将轻量级AI模型VibeThinker高效集成到教学、编程竞赛和科研系统中。强调资源化、标准化接口设计,选用FastAPI实现高性能服务,兼顾安全性、可扩展性与易用性,推动普惠AI落地。
Omoo
1028
云平台RESTful API设计实战:从资源建模到幂等性保障的完整指南
本文系统阐述云平台RESTful API设计的核心方法论,涵盖资源建模、URL与HTTP方法规范、查询参数设计、状态码与错误响应、版本管理、多租户认证鉴权、游标分页、幂等性保障(Idempotency Key)、异步任务模式及全链路request_id追踪。强调一致性原则、开发者体验与线上稳定性,所有实践均源于HoRain云真实落地经验。
小扁不扁
182
RESTful API设计规范与Python FastAPI实践指南
本文系统阐述RESTful API设计核心规范,聚焦Level 2成熟度落地,涵盖资源建模(名词复数、无动词路径)、HTTP方法语义(GET/PUT/PATCH幂等性)、状态码规范(400/401/403/404/409/422等场景化使用)、Pydantic参数校验、统一异常处理、JWT认证、限流与安全配置,并以FastAPI实现订单服务为实例,强调路由轻薄、依赖注入、OpenAPI文档驱动及契约测试,兼顾工程可维护性与协作效率。
张江名媛
253
awesome-java-API接口实战资源
“awesome-java-API接口实战资源”这一标题所涵盖的知识体系,是当前Java后端开发中最为关键、应用最广泛、工程化程度最高的技术栈之一。它并非泛泛而谈的Java语法或基础框架介绍,而是聚焦于现代Web服务的核心交付形态——API(Application Programming Interface)的全生命周期实践:从设计规范、开发实现、自动化文档生成、契约测试,到客户端调用、安全管控、版本演进与平台协作。其描述中虽仅以“Gitee/Github Java Java”简略呈现,实则暗示该资源库是一个开源社区驱动、高度结构化、经生产环境验证的Java API工程实践集合,依托主流代码托管平台(Gitee面向国内开发者,GitHub面向全球生态),体现跨地域、高协同、可持续演进的现代化软件开发范式。标签列表精准勾勒出知识图谱的主干脉络:“Java”是底层语言基石,强调JDK 8+特性(如Lambda、Stream、Optional)、模块化(JPMS)、以及现代Java工程标准(Maven多模块、Gradle构建优化);“API接口”是核心抽象,特指基于HTTP协议、面向资源建模、支持松耦合交互的服务契约,区别于传统RPC或本地方法调用;“RESTful”是架构风格纲领,要求严格遵循HTTP动词语义(GET/POST/PUT/PATCH/DELETE)、状态码规范(200/201/400/401/403/404/422/500)、HATEOAS超媒体约束及无状态设计原则;“Spring Boot”是事实标准开发框架,提供自动配置(Auto-Configuration)、起步依赖(Starter Dependencies)、嵌入式容器(Tomcat/Jetty/Undertow)、外部化配置(application.yml/properties)、Actuator监控端点等开箱即用能力,极大压缩API服务的初始化成本;“Gitee/GitHub”不仅代表代码托管,更承载Issue跟踪、Pull Request评审、CI/CD集成(如GitHub Actions、Gitee Go)、Star/Fork社区反馈机制,构成DevOps闭环;“OpenAPI”(原Swagger Specification)是API描述语言的事实标准(YAML/JSON格式),定义路径、参数、请求体、响应结构、认证方式、示例数据等机器可读契约,支撑代码生成、Mock服务、自动化测试与网关策略配置;“Swagger”是OpenAPI生态中最成熟的可视化工具链(Swagger UI用于交互式文档,Swagger Editor用于契约编写,Swagger Codegen用于客户端/服务端骨架生成),实现“Design-First”或“Code-First”双路径协同;“HTTP客户端”涵盖服务间通信全场景:同步调用(RestTemplate已标记为过时,推荐WebClient响应式编程模型)、异步非阻塞(WebClient + Reactor)、负载均衡(Spring Cloud LoadBalancer)、熔断限流(Resilience4j/Sentinel)、签名验签(OAuth2.0/JWT/SM2)、代理与SSL/TLS深度定制;“API文档”则超越静态Markdown,强调动态生成(Springdoc OpenAPI 2.x/3.x无缝集成)、多语言支持(i18n)、权限分级(管理员可见调试面板,前端仅见精简版)、变更追踪(OpenAPI Diff工具比对版本差异)、与Confluence/Notion等知识库双向同步。压缩包内文件结构进一步印证其实战属性:“README-EN.md”与“readme.txt”双语说明体现国际化协作意识,内容必含快速启动指南(Quick Start)、依赖要求(JDK版本、Maven/Gradle最低版本)、运行命令(./mvnw spring-boot:run)、典型API调用示例(curl命令及Postman Collection导出链接)、常见问题(FAQ)与贡献规范(CONTRIBUTING.md指引);“media”目录存储架构图(PlantUML生成的Sequence Diagram展示请求流转)、接口截图(Swagger UI渲染效果)、性能压测报告(JMeter结果图表)、安全审计日志(OWASP ZAP扫描摘要),直观呈现工程落地细节;“books”子目录绝非电子书堆砌,而是精选权威文献的结构化索引:《RESTful Web APIs》阐释资源建模哲学,《Spring Boot in Action》解析自动配置原理,《Building Microservices》论述API网关与BFF模式,《Secure by Design》指导OAuth2.0授权码流程与PKCE增强,《HTTP权威指南》夯实协议底层(连接管理、缓存控制、内容协商)。综上,该资源库本质是一套可即插即用的Java API工程方法论:它将抽象规范转化为可执行代码,将理论原则落实为检查清单,将社区最佳实践封装为可复用脚本,是Java工程师从“能写接口”迈向“写出健壮、可观测、可治理、可演进”的高成熟度API服务的必备导航图。
lsx202406
RESTful API设计规范
### RESTful API设计规范详解#### 一、RESTful简介RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移
小羊子说
3267
RESTFul API 接口说明
### RESTful API 接口说明#### 一、RESTful API 概述RESTful(Representational State Transfer)API 是一种构建网络应用和服务的标准方法
咲太丶
5338
RESTful API设计规范.pdf
RESTful API设计规范还包括:1. 协议:API与用户的通信协议,一般使用HTTP协议,更安全的情况下使用HTTPS。2.
清河大善人
943
restful前后端分离api接口文档模板
为了实现这种分离,RESTful API作为前后端交互的标准协议被广泛采用。本文档旨在通过一个具体的案例——“图书模块”的API接口文档来详细介绍RESTful API的设计原则及其实现细节。
廿陵
8052
RestFul API 案例
RESTful API是遵循REST原则设计的Web服务接口,它使得客户端和服务器之间的交互变得简单而直观。1.
3163
API设计规范、RESTful API
本文介绍了API设计规范的重要性,重点阐述了RESTful API的设计风格和实现原则。详细解释了RESTful API使用HTTP动词和URI来标识资源和操作资源的方法,并强调了无状态、统一接口等设计原则。同时,提出了在实现RESTful API时应遵循的几个关键点,包括使用名词表示资源、使用HTTP状态码表示请求结果、保持无状态性等。
Python语言开发RESTful API指南
综上所述,Python语言开发RESTful API的核心知识点包括:请求与响应的处理、状态码的返回、序列化和反序列化技术、安全机制如身份验证和权限验证、以及CORS配置和URL规则定义。
_码农一个_
1384