用于CRUD和更多的模型驱动的RESTful API
目录
介绍
背景
使用代码
安装
配置
模型
实体
字段
示例模型
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字段类型。可能的字段类型:
|
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相关推荐
- apirestful php自动测试,PHP实现自动识别Restful API的返回内容类型
如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...
- Azure 5月新发布:CDN图片处理功能, CDN Restful API, 新版CDN管理门户, 计量名称变更延期
备注:Blog具有时效性, 内容随着更新会发现变化,目前时间是2017年5月18日 世界变化很快,Azure变化也很快,5月我们又迎来一大波的更新!Azure注定越来越好! Azure CDN图片处理 ...
- 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接 ...
- 无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口
无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口 回顾 通过之前一篇文章 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接 ...
- 使用 Swagger 文档化和定义 RESTful API
大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API--REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...
- asp编程工具_使用ASP.NET Core构建RESTful API的技术指南
译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术文章<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...
- 【Go API 开发实战 2】RESTful API 介绍
RESTful API 介绍 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数或者接口,目的是提供应用程序与开发人员基于某软件或硬件得 ...
- 深入探索REST(1):如何设计好的RESTful API?
REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典型应用.从其诞生之日开始,它就因其可扩展性和简 ...
- 如何设计好的RESTful API?
REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风格的一个典型应用.从其诞生之日开始,它就因其可扩展性和简 ...
最新文章
- 安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水
- 三星GT-I9308 Galaxy SIII 移动定制机 root方法 (亲测可用)
- 下面代码打印的结果?
- mysql数据库的F5_windows下mysql每天定时备份数据库几种方法
- 【ArcGIS遇上Python】ArcGIS Python实现Modis NDVI批量求年最大值
- ASP面向对象编程探讨及比较
- 2.4 1死锁的概念(1)
- python requests库api_python利用requests库进行接口测试的方法详解
- SplObserver观察者模式
- 可变条码打印软件如何制作黑底白字条形码
- 瑞能实业IPO被终止:年营收4.47亿 曾拟募资3.76亿
- ERROR in ./src/vue/login.vue?vuetype=templateid=28b333d2 2:0 Module parse failed: Unexpected toke
- python第二版课后答案第七章7.5_IDA7.5 启动基础配置
- Cozmo和Vector即将满血复活卷土重来(Digital Dream Labs收购Anki)
- libfdk_aac介绍
- ​复盘共享经济2020:陷入艰难求生困境,转型能否拯救亏损怪圈
- JS判断手机浏览器,并跳转到手机端网页
- Http请求状态码-416
- 面向对象之:三大特性:继承(已讲),封装,多态
- 高等数学(一)夹逼定理
热门文章
- 404!优秀案例分享,这样的页面照样能给你小惊喜
- “3D字体”素材|让你的设计脱颖而出,看起来与众不同
- App导航设计全面梳理——可临摹素材原型模版,轻松缕清思路!
- UI设计的扁平化图标模板素材
- python数据参数_python 的参数总结
- mysql exists依赖查询_MySQL EXISTS 和 NOT EXISTS 子查询
- 笔记本电脑键盘切换_有哪些好用的办公键盘
- Windows下利用C++实现Git自动克隆项目
- Linux内核跟踪eBPF:bpftrace一行教程
- DPDK内存篇(二): 深入学习 IOVA