您当前的位置: 首页 >  restful

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用于CRUD和更多的模型驱动的RESTful API

寒冰屋 发布时间:2019-01-18 11:59:33 ,浏览量:1

目录

介绍

背景

使用代码

安装

配置

模型

实体

字段

示例模型

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后,请按照下列步骤操作:

  1. 创建PostgreSQL数据库。
  2. 在文件config.js中,设置PostgreSQL连接字符串和模式名称以访问新数据库。
  3. 在命令行中,键入以下内容:
# 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
  • email
  • 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模式足够简单或者变得如此复杂以至于不值得)。

API

Evolutility-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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0570s