想要做一个简单的mock测试服务,或有一些小规模的静态数据需要做查询服务,这时候去用Web框架写RESTful API就有些太麻烦了。能不能只给数据,不写代码就能生成API呢?JSON Server,只需要一个JSON文件,不到30秒就可以实现包括CRUD在内的API接口。
简介
JSON Server,是 typicode 在Github上开源的Web API工具,项目位于 https://github.com/typicode/json-server,目前版本为 0.16.1。JSON Server无需进行代码的编写,仅需一个包含数据的JSON文件,就能使用JSON Server提供的命令行工具生成一个RESTful API的服务,支持包括增删改查,以及筛选、分页、排序、全文检索等操作,可以作为小规模数据的Web服务,或者Mock测试服务的开发,十分方便,快捷高效,对于非专业的开发人员而言尤为友好。
安装
JSON Server使用Javascript开发,可以使用NPM进行全局安装:
npm install -g json-server
示例
使用JSON Server十分简单。首先,我们需要创建一个JSON文件,并填充我们的数据:
{ "posts": [ { "id": 1, "title": "json-server", "author": "typicode" } ], "comments": [ { "id": 1, "body": "some comment", "postId": 1 } ], "profile": { "name": "typicode" }}
数据中定义了posts(文章),comments(评论)和 profile(作者信息)这3个数据集合。我们把这个JSON文件保存为 db.json,并在命令行运行
json-server --watch db.json
然后,访问 http://localhost:3000/posts/1,你就会得到响应
{ "id": 1, "title": "json-server", "author": "typicode" }
查询得到了ID为1的文章数据。可以看到,在JSON Server中,我们的db.json充当了一个NOSQL数据库的作用,所有的操作都会在该文件上进行。
JSON Server遵守RESTful API的设计准则,例如对于posts,其所生成的API包括:
GET /postsGET /posts/1POST /postsPUT /posts/1PATCH /posts/1DELETE /posts/1
此外,JSON Server还支持对于属性值的过滤:
GET /posts?title=json-server&author=typicodeGET /posts?id=1&id=2GET /comments?author.name=typicode
支持使用_page和_limit来进行数据列表分页:
GET /posts?_page=7GET /posts?_page=7&_limit=20
支持使用_sort和_order来进行排序:
GET /posts?_sort=views&_order=ascGET /posts/1/comments?_sort=votes&_order=ascGET /posts?_sort=user,views&_order=desc,asc
支持使用_start和_end或_limit来进行数据列表的切片:
GET /posts?_start=20&_end=30GET /posts/1/comments?_start=20&_end=30GET /posts/1/comments?_start=20&_limit=10
支持使用_gte、_lte、_ne和_like等操作符进行大于等于等数据比较的过滤:
GET /posts?views_gte=10&views_lte=20GET /posts?id_ne=1GET /posts?title_like=server
支持使用参数q进行全文本搜索:
GET /posts?q=internet
注意到在我们定义的JSON文件中,comments数据包含了属性postId,实际是一个对于posts.id的外键。JSON Server可以自动利用数据中的连接关系进行查询,使用_embed参数:
GET /posts?_embed=commentsGET /posts/1?_embed=comments
这就可以获取某篇文章的所有评论了。也可以使用简化的接口直接获取评论:
GET /posts/1/commentsPOST /posts/1/comments
更多
JSON Server功能强大,还包括:
- 使用static命令行参数进行静态文件服务;
- 通过port参数改变端口;
- 使用url作为JSON文件的参数来访问远程数据;
- 使用Javascript文件代替JSON文件来实现动态数据生成:
// index.jsmodule.exports = () => { const data = { users: [] } // Create 1000 users for (let i = 0; i < 1000; i++) { data.users.push({ id: i, name: `user${i}` }) } return data}
再运行命令
json-server index.js
- 添加自定义的路由接口,使用routes参数;
{ "/api/*": "/$1", "/:resource/:id/show": "/:resource/:id", "/posts/:category": "/posts?category=:category", "/articles?id=:id": "/posts/:id"}
json-server db.json --routes routes.json
- 添加中间件;
- ……
总结
JSON Server使用方便,功能强大,在轻量的RESTful API开发场景下,其简单的使用方法可以免去了使用各种框架和数据库的繁琐,免除了一些意义不大的重复工作,极大地提高了效率,解放了双手,尤其对于前端开发人员,或数据科学研究者而言十分友好。
JSON Server功能丰富,能够对于数据进行一定程度的认知,并生成合乎期望的API,各种查询操作丰富;底层使用express实现,性能和稳定性等也能满足基本需求;代码结构较为清晰,值得参与进一步的开源贡献。