nodejs运行的mock接口库mock-restful-api

mock restful接口

mock-restful-api

依赖 express 框架实现的接口 mock 服务,仿照 django-rest-framework 实现。支持列表刷选、模糊搜索、排序,增删改查等操作。

源码 https://github.com/SkylerHu/mock-restful-api

1. 安装

安装

npm install mock-restful-api --save-dev

启动 mock 服务执行 npx mock-restful-api --path <fixtures dir>

全局安装

npm install -g mock-restful-api

启动 mock 服务执行 mock-restful-api --path <fixtures dir>

命令行参数支持

mock-restful-api -h 可查看支持的参数:

shell 复制代码
Usage: mock-restful-api [options]

Options:
  -p, --port <number>  mock服务端口,mock service's port number (default: 3001)
  --host <string>      mock服务监听的IP地址,mock service's IP (default: "0.0.0.0")
  --path <string>      mock数据文件的路径/目录,mock json file path (default: "fixtures")
  --prefix <string>    接口path的前缀,api path prefix (default: "/")
  --ignore_watch       忽略监听path参数目录下文件变动而重启服务,ignore watch path for reload app (default: false)
  -l --level <string>  日志级别: debug/info/notice/warn/error (default: "debug")
  -h, --help           display help for command

其中 --path 参数定义的目录必须存在,且会自动监听目录下文件变化进而重启 mock 服务。

2. fixtures 配置文件说明

mcok 数据配置示例:users.json

注: + 代表数据格式深度。

字段 类型 说明 举例
restful string restful 接口 path 定义 "web/users/"
page_size integer list 接口默认分页大小,默认值:20 20
filter_fields object 定义可以刷选的字段 {"username": ["exact", "startswith"]}
search_fields array 定义用于模糊搜索的字段 ["username"]
ordering_fields array 定义用于排序的字段 ["id"]
ordering array 定义默认排序,+递增(默认); -递减 ["id"]
pk_field string 定义数据记录的主键,默认id "id"
rules object 定义 POST 提交数据校验要求 { "username": { "type":"string" } }
rows array 定义 mock 数据初始列表数据 [{...}, {...}]
actions array 基于 restful 定义的其他操作
+method string 请求方法, GET/POST 等
+url_path string action 路径 eg: "cancel",则 path 为 /web/users/cancel/
+detail bool 是否是详情 action,默认 false 为 true 时 path 为 /web/users/:pk/cancel/
+response object 定义返回值 { "code": 200,"json": { "message": "success" } }
apis array 定义其他普通接口
+path string 定义接口 path
+method string 请求方法, GET/POST 等
+response object 定义返回值

以下按照单个字段配置举例说明.

restful

例如配置 web/users/ 后,基础列表数据用 rows 定义, 服务将支持以下接口:(依赖命令行参数 --prefix="/")

  • GET /web/users/ 200 获取列表数据
    • 允许刷选字段由 filter_fields 定义
    • 模糊搜索,接口使用参数 search,允许模糊搜索的字段由 search_fields 定义
    • 排序接口传递参数 ordering,允许排序的字段由 ordering_fields 定义
  • POST /web/users/ 201 新建记录, 若配置了 rules ,将会按照 rules 定义对数据进行校验
  • GET /web/users/:pk([\\w-]+)/ 200 按照 pk_field 定义主键,根据键值 pk 获取详情
  • PATCH /web/users/:pk([\\w-]+)/ 200 更新部分数据
  • UPDATE /web/users/:pk([\\w-]+)/ 200 提交完整数据以更新记录
  • DELETE /web/users/:pk([\\w-]+)/ 204 根据主键删除记录

需要注意的是:

  • 刷选条件对 详情接口的操作也都生效,先根据 query 参数进行刷选,然后再寻找 pk 的记录
  • 新增、修改、删除数据,会实际对 rows 数据操作生效,mock 服务重启后数据重置;
  • 若是启动 mock 服务的参数 --prefix=openapi 则生成接口示例为 GET /openapi/web/users/
filter_fields

对列表数据刷选,能够筛选的字段必须在该字段中明确定义,示例如下:

json 复制代码
{
  "filter_fields": {
    "id": ["exact", "in"],
    "username": ["exact", "in", "contains", "startswith", "endswith", "regex"],
    "age": ["exact", "range", "lt", "lte", "gt", "gte", "isnull"],
    "created_at": ["range"],
    "city__name": ["exact", "in"]
  }
}

其中 field 作为配置数据的键, lookup 作为值,定义筛选的字段。

  • 基本的查找关键字参数采用形式 field__lookup=value (使用双下划线)
    • exact 完全匹配,实现的是 == 运算;eg: username=skyler 等价于 username__exact=skyler
    • isnull 刷选数据是否为空的记录
      • age__isnull=1 筛选数据为 undefined/null 的数据,值为 "" 不符合条件
      • age__isnull=0 熟宣数据不为空的数据
    • in 参数是列表值,可用英文逗号 , 隔开;eg: id__in=1,2,3,返回 username 值在 [1,2,3] 内的数据
    • startswith 前缀匹配,eg: username__startswith=sky
    • endswith 后缀匹配,eg: username__endswith=ler
    • contains 字符串包含,eg: username__contains=ky
    • regex 字符串正则, eg: username__regex=sk.*ler
    • range 区间范围,用于日期、数字甚至字符,传递 2 个值时使用逗号 , 隔开
      • age__range=1,100 刷选 age 值在 [1,100] 内的记录,即 0 <= age <= 100
      • age__range=1 筛选 age >= 1 的记录,等价于 age__gte=100
      • age__range=,100 筛选 age <= 100 的记录,等价于 age__lte=100
    • lt 小于, eg: age__lt=100 刷选 age < 100 的记录
    • lte 小于等于, eg: age__lte=100 刷选 age <= 100 的记录
    • gt 大于, eg: age__gt=1 刷选 age > 1 的记录
    • gte 大于等于, eg: age__gte=1 刷选 age >= 1 的记录
  • 若是 query 参数中对应值为空字符串,则查询条件不生效;例如 username=&search= 这两个条件都是无效刷选;
  • 可用 __ (使用双下划线)定义多级深度的数据查找; eg: city__name__in="beijing" 可帅选出以下数据
json 复制代码
[
  {
    "id": 1,
    "username": "admin",
    "city": {
      "name": "beijing"
    }
  }
]
search_fields

定义模糊搜索的字段,示例:

json 复制代码
{
  "search_fields": ["username", "nickname", "city__name"]
}

通过 query 传递参数 search=skyrows 记录中按照字段 username / nickname / city.name 判断是否包含 sky 的记录,其中任意一个字段匹配成功即符合条件。

ordering_fields

定义可以用于排序的字段,示例:

json 复制代码
{
  "ordering_fields": ["id", "name"],
  "ordering": ["id"]
}

通过 query 传递参数 ordering=-id,+name ,表示返回的列表数据 按照 id 降序name 升序 的顺序返回。

若 query 没有传递 ordering 参数,则按照默认的配置 "ordering": ["id"]id 升序 返回数据,无符号 +/-时默认为 +升序。

pk_field

定义 rows 列表数据的主键,默认为 id。详情接口中 <pk> 值与该字段值匹配。

请求 GET /web/users/1/ 则是返回 rows 中数据 id=1 的记录。

rules

定义 新增/修改 数据的校验规则,示例:

json 复制代码
{
  "rules": {
    "username": { "type": "string", "pattern": "\\w+", "required": true },
    "is_active": { "type": "boolean" },
    "age": { "type": "number", "integer": true, "min": 0, "max": 100 },
    "gender": { "type": "string", "valid": ["male", "female"] }
  }
}
  • username 字符串正则,且是必须的字段
  • is_active 定义 bool 类型
  • age 数值定义取值范围
  • gender 字符串,valid 定义枚举值范围

校验规则通过 joi 实现,将 json 配置转成成 Joi 的校验类。具体支持的类型和方法参照 https://joi.dev/api/

actions

actions 是对 restful 的扩展,依赖 restful 的定义,示例:

json 复制代码
{
  "actions": [
    {
      "method": "POST",
      "url_path": "create/",
      "response": {}
    },
    {
      "method": "get",
      "url_path": "releated/",
      "detail": true,
      "response": {}
    }
  ]
}

以上配置根据拼接规则 {restful}/{url_path} 会生成以下接口:

  • POST /web/users/create/
  • GET /web/users/:pk([\\w-]+)/releated/ 因为定义了 detail=true,所以路由支持传递 pk
    • 需要注意的是,pk 只要符合正则定义,无论何值,返回结果都按照 response 定义返回
    • GET /web/users/1/releated//web/users/2/releated/ 返回值一样

注意:生成的接口 path 是否 / 结尾,取决于 restful 的配置是否 / 结尾。

apis

定义其他扩展的接口,不依赖 restful ,可单独存在,示例:

json 复制代码
{
  "apis": [
    {
      "method": "get",
      "path": "web/enums/",
      "response": {
        "code": 200,
        "text": "text"
      }
    }
  ]
}
response 返回值配置

actionsapis 中的配置格式一样,接口都按照配置的数据返回结果。

字段 类型 说明 举例
code intrger 定义返回状态码 默认值 200
headers object 定义返回 Header 键值对 {"Content-Type": "image/png"}
json any 定义返回的 json 数据
text string 定义返回的文本数据
file string 定义实现下载文件 配置文件相对(当前运行路径)/绝对路径, eg: ./test.jpg

3. 接口请求示例

列表接口
shell 复制代码
curl "http://0.0.0.0:3001/web/users/?is_active=1&ordering=-id&city__name=anhui&search=sky"

返回状态码为 200

json 复制代码
{
  "count": 1,
  "results": [
    {
      "id": 2,
      "username": "skyler",
      "nickname": "Skyler",
      "is_active": true,
      "age": 18,
      "gender": "male",
      "score": 99.9,
      "created_at": "2024-08-19 21:33:26",
      "groups": [
        {
          "id": "2",
          "name": "dev"
        }
      ],
      "city": {
        "id": 2,
        "name": "anhui"
      }
    }
  ]
}
创建记录
shell 复制代码
curl -XPOST "http://0.0.0.0:3001/web/users/" -H "Content-Type: application/json" -d '{"username":"test"}'

返回状态码为 201

json 复制代码
{
  "id": 6,
  "username": "test"
}
修改接口
shell 复制代码
curl -XPATCH "http://0.0.0.0:3001/web/users/6/" -H "Content-Type: application/json" -d '{"username":"test2"}'

返回状态码为 200

json 复制代码
{
  "id": 6,
  "username": "test2"
}
详情接口
shell 复制代码
curl "http://0.0.0.0:3001/web/users/6/"

返回状态码为 200

json 复制代码
{
  "id": 6,
  "username": "test2"
}
删除接口
shell 复制代码
curl -XDELETE "http://0.0.0.0:3001/web/users/6/"

返回状态码为 204,无返回值。

4. 项目中配置接口 Proxy

以 React 项目为例,在 src/setupProxy.js 文件中增加如下配置:

javascript 复制代码
const createProxyMiddleware = require("http-proxy-middleware");

module.exports = function (app) {
  if (process.env.NODE_ENV !== "production") {
    app.use(
      createProxyMiddleware("/web/users", {
        target: "http://0.0.0.0:3001",
        changeOrigin: true,
        logLevel: "debug",
      })
    );
  }
};

proxy 更多配置参考 http-proxy-middleware

相关推荐
Pandaconda2 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
编程小筑37 分钟前
R语言的编程范式
开发语言·后端·golang
技术的探险家39 分钟前
Elixir语言的文件操作
开发语言·后端·golang
ss2731 小时前
【2025小年源码免费送】
前端·后端
Ai 编码助手1 小时前
Golang 中强大的重试机制,解决瞬态错误
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的区块链
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的循环实现
开发语言·后端·golang
梁雨珈2 小时前
Lisp语言的物联网
开发语言·后端·golang
邓熙榆3 小时前
Logo语言的网络编程
开发语言·后端·golang
羊小猪~~7 小时前
MYSQL学习笔记(四):多表关系、多表查询(交叉连接、内连接、外连接、自连接)、七种JSONS、集合
数据库·笔记·后端·sql·学习·mysql·考研