restful规范

restful接口规范
HTTP API 接口规范

简介

本文档约束思维API开发流程,同时提供 API 设计风格建议。

本文档中使用的要求级别关键字(“必须”、“不得”、“必需”,“应”、“不应”、“应该”、“不应该”、“建议”、“可以”和“可选”)将按 RFC 2119 中的描述进行解释。

在本文档中,这些关键字使用粗体突出显示。

本文档参考Google Cloud API 设计指南

接口开发流程

1, 前端研发同学根据需求梳理成接口需求,输出YAPI定义( 建议 同时提供基于TypeScript的*.d.ts定义)。2, 前端同学发起接口评审会议,与后端同学确定接口方案,并修订YAPI定义。3, 前后端同学同时基于约定的YAPI定义开始开发。4, 集成联调。5, 提交测试。

接口设计规范

1, 所有请求方法 必须 被映射到5个标准方法。

2, 所有接口的请求参数 必须 被严格定义。

3, 所有接口的返回结构 必须 被严格定义(不允许 出现字段名为xxxDTO或者数据类型为JSON字符串的情况)。

4, 两种风格的接口都是受到支持的:

符合RESTful 规范的 面向资源的 基础接口。

符合请求性能需求的面向页面的业务聚合型接口。

标准方法

HTTP 接口的“标准方法”包括:List、Get、Create、Update和Delete方法。

强制要求:

所有的接口行为必须 被合理、准确、无歧义地映射到这五个方法中的一种。

POST, PUT 方法的参数 必须 位于请求正文内(HTTP Request Body). 数据格式(Content-Type)为application/json;

标准方法HTTP映射HTTP请求正文HTTP响应正文

ListGET 无资源列表

GetGET 无资源

CreatePOST 资源资源

UpdatePUT 资源资源

DeleteDELETE 无无

List 方法

List 方法用于提供某类资源的列表,例如:课堂列表,测评题试卷列表,任务列表 等。

强制行为:

必须使用 HTTPGET 动词

返回的资源列表元素必须 属于 “同一类型”,

建议行为:

建议支持常见的行为参数,例如:分页(page&pageSize) 、排序(sort) 、过滤 、字段筛选 。

元素字段建议 经过剪裁,必要时 建议 提供结果字段筛选功能。

示例

<== GET /classroom/

    ?teacherId=123

    &page=1

    &pageSize=20

    &date.gte=123123123

    &sort=date.desc

==> {

    data: [

        { code: 'CRxxxxx', teacherId: 123, ....}

        { ... }

        { ... }

    ]

}

Get 方法

Get 方法常用于请求某一特定的资源,通常是通过资源的ID或者资源的名称进行检索,例如:

GET /user 获取当前用户信息

GET /classroom/${code} 获取某个课堂信息

GET /post/ p o s t i d / c o m m e n t / {post_id}/comment/ postid/comment/{comment_index} 获取某个帖子的某个评论

强制行为:

必须使用 HTTPGET 动词。

建议行为:

数据字段建议 经过剪裁,必要时 建议 提供结果字段筛选功能。

Create 方法

Create 方法常用于创建资源,例如:生成课堂, 生成订单, 生成考试报告 等。

强制行为:

必须使用 HTTPPOST 动词。

创建成功必须 返回HTTP 201 状态码

建议行为:

[if !supportLists]1. [endif]创建成功后建议 返回创建的实体,数据格式 建议 和对应的 Get 方法一致。

<== POST /classroom/

{

    courseware: 'math-l1-c1',

    lessonCode: 123123,

    ...

}

==> {

    code: 'MK1231231',

    courseware: 'math-l1-c1',

    lessonCode: 123123,

    ...

}

Update 方法

Update 方法常用于更新指定资源的相关信息,例如:更新手机号,更新预约时间,更新收货地址等。

强制行为:

必须使用HTTP PUT 动词

由于目前微信小程序的部分版本不支持客户端使用HTTP PATCH 动词,本规范约定 不允许 使用 HTTP PATCH 动词。

建议行为:

更新完成后建议 返回更新后的资源数据,格式 应该 与对应的Get方法一致。

示例

<== PUT /user

{

    username: 'jack',

}

==>

{

    userId: 12313,

    username: 'jack'

    birthday: '2018-11-11',

    ...

}

Delete方法

Delete 方法常用于删除某个资源, 或者标记某个资源处于失效状态,例如: 退出登陆(删除Session), 删除地址 等。

强制行为:1, 必须 使用 HTTP DELETE 动词。

<== DELETE /session

==> (空)

URL规范

为了让API 更易于被发现与理解,URL应该具有以下特点:

简单: 使用简单易懂的单词,避免冗余的描述, 例如:/evaluate/classes_list 应当改为 /evaluate/class/。

一致: 使用与大家达成一致的名词, 并保证在系统内名词解释是一致的, 例如:class, classroom, course, lesson等。

此外URL需遵守以下规范:

1, 由于URL对大小写不敏感,因此URL 必须 是小写的,并且用 _ 分割。2, List方法和Create方法对应的URL称为 Collection URL, 建议 以 /结尾。3, Get, Update, Delete 方法对应的URL称为 Resource URL, 不允许 以 /结尾。4, URL内单词的词性 应该 是 名词, 并且使用 单数形态。5, 用于获取指定ID的资源的URL,应该 将ID置于path内, 而 不应该 置于query内。6, URL内 应该 包含API版本, 例如: https://api.huohua.cn/v1/classroom。

示例:

GET /classroom/ 获取班级列表

GET /classroom/${code} 获取指定的班级详情

DELETE /session 退出登陆

POST /address/ 创建地址

GET /classroom/${code}/lesson 获取某班级的课次信息

GET /classroom/${code}/student/ 获取班级内学生列表

GET /classroom/ c o d e / s t u d e n t / {code}/student/ code/student/{student_id} 获取某班级内某学生信息

Bad Case:

POST /classroom/create 应该改成 POST /classroom/

GET /classroom/mk_list_by_user 应该改成 GET /classroom/?code_prefix=mk,by_user的行为应该由session 决定。

GET /classroomTeacher 应该改成 GET /classroom/${code}/teacher

GET /lesson/lesson_list 应该改成 GET /lesson/

接口输出

标准格式

API 返回应遵循以下格式。

名称类型说明

success boolean用于表明本次请求成功与否

message string用于输出本次接口结果消息,常用于表达错误消息。

code number用于输出本次请求的状态码,常用于表达错误状态码。

data any用于承载本次请求主要数据实体内容

API 返回中的 data 字段内包含本次接口返回的主要数据,数据字段应当遵守以下规则:

1, 数据结构嵌套 不应该 超过3层。2, 字段名 应该 遵循 小写 + _ 风格。3, 字段值 不应该 出现 JSON字符串 的形式。

异常输出

API 异常大致分为两类:

客户端异常: 客户端发起了不被允许的请求,例如登录凭证失效后访问/user接口等。这种情况下接口应该返回4xx 的HTTP状态码。

服务端异常: 由于服务器行为导致的异常应该返回5xx 的HTTP状态码。

两种异常在情况允许的情况下仍然应该按照标准格式 输出结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值