目录

介绍

背景

使用代码

安装

配置

模型

实体

字段

示例模型

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 /<object>/<id>GET /todo/12

得到很多

每个模型都暴露在外。您可以使用模型ID查询项目列表。

GET /<object>GET /todo

过滤

您可以通过在字段上添加条件来过滤结果行,每个条件都是查询字符串参数。

GET /<object>/<field.id>=<operator>.<value>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 /<object>?order=<field.id>.<asc/desc>GET /todo?order=priority.desc,title.asc

如果未指定方向,则默认为升序:

GET /todo?order=duedate

限制和分页

保留字“ page”和“ pageSize”限制响应行。

GET /<object>?page=<pageindex>&pageSize=<pagesize>GET /todo?page=0&pageSize=50

格式化

默认情况下,所有API都以JSON格式返回数据。此API调用允许以CSV格式请求数据(导出到Excel)。此功能使用express-csv。

GET /<object>?format=csvGET /todo?format=csv

注意:在返回的数据中,每个对象都有一个额外的属性“ _full_count”,表示查询中的记录总数(在限制之前)。

更新数据

记录创建

要在数据库表中创建行,请发布一个JSON对象,该对象的键是您要创建的列的名称。缺少的密钥将在适用时设置为默认值。

POST /todo
{ title: 'Finish testing', priority: 2}

更新

PATCH /todo
{ title: 'Finish testing', priority: 2}

删除

只需使用DELETE带有记录ID 的动词即可删除。

DELETE /<object>/<id>DELETE /todo/5

额外端点

除了CRUD之外,Evolutility-Server-Node还提供了常见UI需求的端点,如图表和值列表。

发现

返回对象及其API的列表(仅包括标记为活动的对象)。

GET /

注意:必须在的配置中使用{apiInfo:true}启用此端点。

图表

对于图表数据,可以获得聚合数据。

GET /<object>/chart/<field id>GET /todo/chart/category

值列表

UI 中的下拉字段(在模型中的field.type="lov")拥有REST端点以获取下拉列表的值列表。

GET /<object>/lov/<field id>GET /todo/lov/category

统计

返回模型中数字字段的总计数,最小值,最大值,平均值和总数。

GET /<object>/statsGET /todo/stats

上传文件

此端点允许您上载文件。当前(天真)实现只将文件保存在文件服务器上名为对象ID的文件夹中。

POST /<object>/upload/<id>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

用于CRUD和更多的模型驱动的RESTful API相关推荐

  1. apirestful php自动测试,PHP实现自动识别Restful API的返回内容类型

    如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...

  2. Azure 5月新发布:CDN图片处理功能, CDN Restful API, 新版CDN管理门户, 计量名称变更延期

    备注:Blog具有时效性, 内容随着更新会发现变化,目前时间是2017年5月18日 世界变化很快,Azure变化也很快,5月我们又迎来一大波的更新!Azure注定越来越好! Azure CDN图片处理 ...

  3. 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接 ...

  4. 无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口

    无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接 ...

  5. 使用 Swagger 文档化和定义 RESTful API

    大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API--REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...

  6. asp编程工具_使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术文章<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  7. 【Go API 开发实战 2】RESTful API 介绍

    RESTful API 介绍 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数或者接口,目的是提供应用程序与开发人员基于某软件或硬件得 ...

  8. 深入探索REST(1):如何设计好的RESTful API?

    REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典型应用.从其诞生之日开始,它就因其可扩展性和简 ...

  9. 如何设计好的RESTful API?

    REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典型应用.从其诞生之日开始,它就因其可扩展性和简 ...

最新文章

  1. java日历教程_JAVA Calendar方法使用基础教程详解
  2. IOS 开发之-- textfield和textview,return键的改变,点击return键
  3. oracle数据库结束进程后怎么重启,Oracle数据库的启动与关闭方法
  4. laravel 初识
  5. 如何修改 Chrome 默认的 font-size
  6. 【SpringBoot 】SpringBoot注解详解
  7. UI线框图模板素材实际应用好帮手
  8. 怎么把文件导入云服务器,怎么把文件放到云服务器里
  9. ASP.NET MVC程序播放H.264视频
  10. Python注释的写作笔记
  11. 小米路由器R1D改造记录-安装MIXBOX
  12. 降低网站跳出率9种方法
  13. 将社会工程学演绎成艺术---弗兰克·威廉·阿巴内尔的传奇故事--黑客博客
  14. PS2接口键盘、鼠标改成USB接口
  15. mac OS系统中 设置ssh连接端口
  16. rasp 系统_RASP 类接口
  17. 【捡肥皂】Microsoft SQL Server 2000 MSSQL2000下载中文企业版个人版免费下载
  18. 安装过程中弹出错误信息,Xshell4提示nslicense.dll无法安装成功
  19. 二级考python还是office_大学生考二级为什么考office比C语言科目会更有价值
  20. win7配置C语言VS2010,开发Windows7软件的绝配:Visual Studio 2010

热门文章

  1. android responsebody转json_SpringBoot 项目开发是如何返回 json 数据以及数据封装
  2. 好用的python表白神器_Python|520表白神器
  3. 高级工程师java_Java从0到高级工程师
  4. 牛年2021新年海报该有的样子!
  5. 找不到图片素材,看这里
  6. python中valueerror是什_Python:ValueError和Exception的区别?
  7. Python GUI 截图小工具 实例Demo
  8. 4KB/4MB 32位分页模式下的线性地址翻译以及CR3
  9. libevent的两个服务端、客户端示例(C语言)
  10. 一个简单的状态机设计