目录
介绍
背景
使用代码
安装
配置
模型
实体
字段
示例模型
API
请求信息
得到一个
过滤
排序
限制和分页
格式化
更新数据
记录创建
更新
额外端点
发现
图表
总结
使用node.js、express和postgresql,用javascript编写的CRUD等RESTful通用端点。
- GitHub的项目
本文介绍了一个用于CRUD(创建,读取,更新,删除)的模型驱动的RESTful API。有了它,您可以编写简单模型(指定数据库表和要公开的列集),并且CRUD的REST端点将自动可用。不需要任何SQL的手工编码。
该概念可以在不同的技术堆栈和语言上实现。在这里,我使用了JavaScript(生成SQL)与Node.js,Express和PostgreSQL。
背景大多数项目需要创建,读取,更新和删除对象。当这些对象足够简单时(数据库中有一个驱动表和几列),从一个对象到另一个对象的代码非常相似。实际上,模式是相同的,唯一的区别是表的名称以及列的名称和类型。
当然,总会有复杂的端点需要手工编写,但通过自动化简单端点,我们可以节省大量时间。
使用代码示例数据库为待办事项列表,地址簿和图形小说清单提供了3个示例。这些示例使用对象ID“ todo”,“ contact”和“ comics”,如其模型中所指定的。
使用它们后,更改数据库(在config.js中),更改模型(在models目录中),RESTful API将根据您的数据结构进行更改。
按照以下步骤使用示例数据库安装和设置项目。
安装从GitHub 下载或克隆。
# To get the latest stable version, use git from the command line.
git clone https://github.com/evoluteur/evolutility-server-node
或使用npm包:
# To get the latest stable version, use npm from the command line.
npm install evolutility-server-node
安装Evolutility-Server-Node后,请按照下列步骤操作:
- 创建PostgreSQL数据库。
- 在文件config.js中,设置PostgreSQL连接字符串和模式名称以访问新数据库。
- 在命令行中,键入以下内容:
# Install dependencies
npm install
# Create sample database w/ demo tables
node js/setup/database.js
# Run the node.js server
npm start
在Web浏览器中,转到URL http://localhost:3000/api/v1/evolutility/todo。
配置在根目录中,编辑文件“ config.js ”以设置数据库连接以及其他选项,如分页和上载目录。
模型要使REST API可以访问,必须在模型中描述每个数据库表。模型包含驱动表的名称以及API中存在的字段/列的列表。
实体属性
含义
id
标识实体的唯一键(用作API参数)
table
数据库表名
fields
字段数组
titleField
记录标题的字段ID
searchFields
用于执行搜索的字段的字段ID数组
字段属性
含义
id
该字段的唯一键(可以与列相同但不一定是)
column
该字段的数据库列名称
lovtable
要连接到表的字段值的表(仅适用于“ lov”类型的字段)
lovcolumn
lovtable字段值的列名(在)中(仅适用于“ lov”类型的字段)
type
字段类型不是数据库列类型,而是UI字段类型。可能的字段类型:
- boolean (是/否)
- date
- datetime
- decimal
- document
- image
- integer
- lov (值列表)
- money
- text
- textmultiline
- time
- url
readonly
防止字段修改
inMany
确定字段是否存在(默认情况下)在记录列表中
注:更多的字段属性(unique,min,max,minLength,maxLength...)将在以后添加。
示例模型这是一个To-Do应用程序的模型。
module.exports = {
id: "todo",
table: "task",
titleField: "title",
searchFields: ["title", "duedate", "description"],
fields: [
{
id: "title",
column: "title",
type: "text",
inMany: true
},
{
id: "duedate",
column: "duedate",
type: "date",
inMany: true
},
{
id: "category",
column: "category_id",
type: "lov",
lovtable: "task_category",
inMany: true
},
{
id: "priority",
column: "priority_id",
type: "lov",
lovtable: "task_priority",
required: true,
inMany: true
{
id: "complete",
column: "complete",
type: "boolean",
inMany: true
},
{
id: "description",
column: "description",
type: "textmultiline"
}
]
};
此模型仅涵盖后端。也可以对前端进行建模(只要UX模式足够简单或者变得如此复杂以至于不值得)。
APIEvolutility-Server-Node的API深受PostgREST的启发(甚至部分复制),后者也提供通用的CRUD,但是是直接检查数据库模式而不是使用模型。
在本地运行项目时,“ todo”应用程序的URL为 http://localhost:3000/api/v1/evolutility/todo.。
请求信息 得到一个通过ID获取特定记录,请使用“ < ObjectName >/ID”。
GET //
GET /todo/12
得到很多
每个模型都暴露在外。您可以使用模型ID查询项目列表。
GET /
GET /todo
过滤
您可以通过在字段上添加条件来过滤结果行,每个条件都是查询字符串参数。
GET //=.
GET /todo?title=sw.a
GET /todo?priority=in.1,2,3
添加多个参数会结合以下条件:
todo?complete=0&duedate=lt.2017-01-01
这些操作符可用:
操作符
含义
例子
eq
等于
/todo?category=eq.1
gt
比...大
/todo?duedate=gt.2017-01-15
lt
小于
/todo?duedate=lt.2017-01-15
gte
大于等于
/todo?duedate=gte.2017-01-15
lte
小于等于
/todo?duedate=lte.2017-01-15
ct
包含
/todo?title=ct.e
sw
从...开始
/todo?title=sw.a
fw
完成
/todo?title=fw.z
in
值列表中的一个
/todo?priority=in.1,2,3
0
是假的
/todo?complete=0
1
是真的
/todo?complete=1
null
null
/todo?category=null
nn
不是null
/todo?category==nn
排序保留字“ order”重新排序响应行。它使用以逗号分隔的字段和方向列表:
GET /?order=.
GET /todo?order=priority.desc,title.asc
如果未指定方向,则默认为升序:
GET /todo?order=duedate
限制和分页
保留字“ page”和“ pageSize”限制响应行。
GET /?page=&pageSize=
GET /todo?page=0&pageSize=50
格式化
默认情况下,所有API都以JSON格式返回数据。此API调用允许以CSV格式请求数据(导出到Excel)。此功能使用express-csv。
GET /?format=csv
GET /todo?format=csv
注意:在返回的数据中,每个对象都有一个额外的属性“ _full_count”,表示查询中的记录总数(在限制之前)。
更新数据 记录创建要在数据库表中创建行,请发布一个JSON对象,该对象的键是您要创建的列的名称。缺少的密钥将在适用时设置为默认值。
POST /todo
{ title: 'Finish testing', priority: 2}
更新
PATCH /todo
{ title: 'Finish testing', priority: 2}
删除
只需使用DELETE带有记录ID 的动词即可删除。
DELETE //
DELETE /todo/5
额外端点
除了CRUD之外,Evolutility-Server-Node还提供了常见UI需求的端点,如图表和值列表。
发现返回对象及其API的列表(仅包括标记为活动的对象)。
GET /
注意:必须在的配置中使用{apiInfo:true}启用此端点。
图表对于图表数据,可以获得聚合数据。
GET //chart/
GET /todo/chart/category
值列表
UI 中的下拉字段(在模型中的field.type="lov")拥有REST端点以获取下拉列表的值列表。
GET //lov/
GET /todo/lov/category
统计
返回模型中数字字段的总计数,最小值,最大值,平均值和总数。
GET //stats
GET /todo/stats
上传文件
此端点允许您上载文件。当前(天真)实现只将文件保存在文件服务器上名为对象ID的文件夹中。
POST //upload/
POST /comics/upload/5
使用Query参数:file和“ fieldid”。
API版本
此端点获取API版本(在项目的package.json文件中指定)。
GET /version
总结
模型驱动架构(MDA)可以让您更快地运行并且还可以节省您的项目维护时间。
例如,项目完成后,我们经常需要添加字段。通常,这意味着向数据库添加一个列,并在每个使用数据库表的REST端点中手动添加该字段。使用模型驱动的方法,一旦将列添加到数据库,您只需要在单个位置(模型)中添加字段,并且使用该模型的每个端点都将公开它。
模型驱动的方法也可以应用于UI。如果你想尝试一下,我做了两个不同的匹配模型驱动的UI实现,Evolutility-UI-React(用于React)和Evolutility-UI-jQuery(用于jQuery和BackboneJS)。
原文地址:https://www.codeproject.com/Articles/1169060/Model-driven-RESTful-API-for-CRUD-and-More