RESTful API设计规范

在上一篇RESTful系列文章中,笔者介绍了RESTful API定义及管理。接下来,本篇文章将阐释RESTful API设计规范:一、目标二、URL定义格式三、资源表述四、 资源名和资源值五、统一接口六、响应状态码七、批量操作八、重载POST九、自定义报头十、授权
摘要由CSDN通过智能技术生成

目录

一、目标 

二、URL定义格式

2.1 Scheme

2.2 Port

2.3 Path

前缀

资源地址

2.4 Query

三、资源表述

四、 资源名和资源值

4.1 命名规范

4.2 时间戳格式

4.3 枚举类型定义规范

4.4 标准字段

4.5 通用参数名

4.6 单复数

五、统一接口

六、响应状态码

200 OK

201 Created

202 Accepted

204 No Content

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

405 Method Not Allowed

409 Conflict

500 Internal Server Error

501 Not Implemented

503 Service Unavailable

七、批量操作

PATCH,用PUT替代

有原子性

无原子性

八、重载POST

九、自定义报头

十、授权

十一、参考链接


一、目标 

  1. 明确对外提供服务的API格式
  2. 明确系统资源划分的方式
  3. 明确URL定义格式
  4. 明确API请求和响应信息格式
  5. 明确错误码定义格式

二、URL定义格式

URI组成部分:

https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E6%A0%87%E5%BF%97%E7%AC%A6​​​​​​

 hierarchical part
        ┌───────────────────┴─────────────────────┐
                    authority               path
        ┌───────────────┴───────────────┐┌───┴────┐
  abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
  └┬┘   └───────┬───────┘ └────┬────┘ └┬┘           └─────────┬─────────┘ └──┬──┘
scheme  user information     host     port                  query         fragment

2.1 Scheme

客户端在通过API与服务端进行通信时,必须使用HTTPS协议,才能保证报文安全,除非调试接口,否则严禁使用HTTP。

2.2 Port

各微服务对外提供服务时需要统一API端口,如HTTPS统一使用443,也可以自定义使用其他端口。

2.3 Path

前缀

path部分以api开头,后跟微服务名、版本及模块名或资源地址,示例:

  • https://host:port/api/message/v1/notification

message表示消息微服务。

v1表示版本,以字母v开头,后跟数字,API若无法保持兼容,或无法在旧API上进行扩展,则应使用新版本API。

notification表示微服务内部的一个模块或者资源地址,名字及层级均可自定义,具体见下一节资源地址

资源地址

参考文档RESTful API设计基础知识-资源分类RESTful API设计基础知识-URI设计

在路径设计中需要遵守下列约定:

  • 资源命名全部小写且易读,可使用连字符(-)或下划线(_)进行分隔
  • 资源名不可以使用 (.) 和 (..),会被浏览器识别为相对路径。
  • 资源的命名需要符合RESTful风格,只有算法资源中可以存在动词,否则只能使用名词
    • 算法资源:在数据集上执行算法的结果的资源,注重从该动作的结果方面来考虑(如"地图上符合搜索条件的地点")。
    • 其他资源:为特别目的专门预定义的一次性资源、服务暴露的每一个对象所对应的资源。
  • 路径部分使用斜杠分隔符(/)来表达层次结构:/parent/child。
  • 路径部分使用逗号(,)来表示非层次结构:/parent/child1,child2。
  • 采用OAS 3.0描述的API,必须遵循路径参数序列化规则:Parameter Serialization,统一使用下图红框中的风格。
    为防止URL过长被截断,服务端收到请求后需要检测序列化后的路径参数是否和请求body中对应字段匹配(个数是否相等、内容是否相同),不匹配则抛错处理。

示例如下:

  • https://host:443/api/micro-service/v1/file/{docid}/download-info
  • https://host:443/api/micro-service/v1/earth/37.0,-95.2 
  • https://host:443/api/micro-service/v1/file/items_count,items

2.4 Query

若路径变量与标点符号均解决不了问题,或者如果你要往一个算法里代入参数的话,那么可以采用查询变量(query variables)。

如果两个URIs只在查询变量上有差别,这表明它们只是为同一算法设置了不同的参数。

用查询变量来表达算法的输入:GET /search?q=jellyfish&start=20。

参数设计需要遵守下列约定:

  • 参数名使用下划线分隔小写字母的方式命名。
  • 采用OAS 3.0描述的API,必须遵循查询参数序列化规则:Parameter Serialization,统一使用下图红框中的风格

示例如下:

三、资源表述

请求body、响应body中的数据,即是资源表述,描述资源地址所指向数据的样子,格式为json,只允许使用object和array,不允许直接请求或响应string、number等。

所有请求和响应的"Content-Type"必须和实际的数据格式保持一致,保证调试工具(如:Postman)、SDK生成工具、文档生成工具能够正确识别接口。

四、 资源名和资源值

资源地址、资源表述、query中的资源名和资源值均需遵循以下规则

4.1 命名规范

资源地址中的资源名,采用小写字母,使用连字符(-)下划线(_)分隔

资源表述、query中的资源名,采用小写字母,使用下划线(_)分隔

若同一资源名会出现在资源地址、资源表述、query中,资源名必须一致,即统一使用下划线(_)分隔

4.2 时间戳格式

资源值为时间戳时,统一使用RFC3339格式。

4.3 枚举类型定义规范

资源值为枚举类型时,统一使用小写字符串,如有多级的情况,使用( . )进行层级区分。

message.new:关注是否有新消息产生

message.readed:关注是否有消息被标记已读

audit.apply:关注是否有新审核申请产生

audit.approved:关注是否有申请被审核

4.4 标准字段

使用一组标准资源名和资源值定义来确保相同的概念在不同API中具有相同的名称和语义。

4.5 通用参数名

现有已知通用的参数名如下表所示。

  • 分页搜索
使用位置 参数名 参数类型 描述 用法
query offset int64 开始响应的项目的偏移量

默认为0(>=0),小于0则抛错

未传offset字段,或未设置offset的值时,取默认值

limit int64 每页最多可返回的项目数

默认20(可根据功能修改默认值),范围为 [1, 1000],超出范围则抛错

未传limit字段,或未设置limit的值时,取默认值

direction string 排序结果方向 可选值:asc、desc
sort string 排序类型
response body entries Array of objects 条目列表
{
    "entries": [
       {...},
       {...}
    ],
    "total_count": 95
}
total_count integer <int64> 总条数(忽略offset和limit)

4.6 单复数

表示多个数据的集合的资源名应使用复数,如:

  1. 若干个文件,/files
  2. 某个具体文件,/files/{id}

五、统一接口

参考文档:RESTful API设计基础知识-统一接口

对于资源的具体操作类型,由HTTP方法表示:

  • GET:用于获取关于资源的信息。
  • HEAD:与GET类似,但响应时只返回首部。
  • PUT:用于设定资源状态。服务器根据客户端发送请求时提供的表示来创建或修改资源的状态。
  • POST:用于新建从属资源,或用于往已有资源的状态里添加数据。
  • DELETE:用于删除资源。

其中,

  • 获取资源信息使用GET方法。
  • 新建/更新资源根据自身情况选择PUT或POST方法。
  • 删除资源使用DELETE方法。

HTTP方法和路径可能的组合如下:

请求方法

URL

描述

GET /department 获取所有部门信息
POST /department 新增一个新的部门
GET /department/{departmentid} 获取指定部门详细信息
PUT /department/{departmentid} 更新指定部门信息
DELETE /department/{departmentid} 删除指定部门

对HTTP方法的使用,一定要遵循相应方法的安全性和幂等性

<
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RESTful API设计规范是一种用于构建可扩展、灵活且易于理解的API架构风格。以下是一些常见的RESTful API设计规范: 1. 使用合适的HTTP方法:根据操作类型选择合适的HTTP方法,如GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。 2. 使用合适的URI:URI应该被设计成有意义且易于理解的结构。使用名词来表示资源,避免使用动词或操作。 3. 使用合适的HTTP状态码:根据操作的结果返回合适的HTTP状态码。例如,200表示成功,201表示资源创建成功,404表示资源不存在等。 4. 使用版本控制:在URI中包含版本号来管理API的变化,以保持向后兼容性。 5. 使用合适的HTTP头部信息:使用适当的HTTP头部信息来提供额外的元数据,如Content-Type和Accept用于指定请求和响应的数据格式。 6. 使用合适的错误处理机制:对于错误情况,返回合适的错误码和错误信息,并提供清晰的错误处理机制。 7. 使用过滤、分页和排序:对于大量数据的查询,提供过滤、分页和排序的功能,以提高性能和用户体验。 8. 使用合适的安全机制:对于敏感数据或操作,使用适当的身份验证和授权机制,如OAuth2.0。 9. 提供合适的文档和示例:为API提供清晰、详细的文档和示例,以便开发者能够快速理解和使用API。 10. 遵循HATEOAS原则:为API提供超媒体驱动的链接,使客户端能够通过链接发现和导航API的资源。 这些是常见的RESTful API设计规范,根据具体项目需求和团队约定,可能会有所调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值