目录

介绍

背景

使用代码

安装

配置

模型

实体

字段

示例模型

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. 安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水
  2. 三星GT-I9308 Galaxy SIII 移动定制机 root方法 (亲测可用)
  3. 下面代码打印的结果?
  4. mysql数据库的F5_windows下mysql每天定时备份数据库几种方法
  5. 【ArcGIS遇上Python】ArcGIS Python实现Modis NDVI批量求年最大值
  6. ASP面向对象编程探讨及比较
  7. 2.4 1死锁的概念(1)
  8. python requests库api_python利用requests库进行接口测试的方法详解
  9. SplObserver观察者模式
  10. 可变条码打印软件如何制作黑底白字条形码
  11. 瑞能实业IPO被终止:年营收4.47亿 曾拟募资3.76亿
  12. ERROR in ./src/vue/login.vue?vuetype=templateid=28b333d2 2:0 Module parse failed: Unexpected toke
  13. python第二版课后答案第七章7.5_IDA7.5 启动基础配置
  14. Cozmo和Vector即将满血复活卷土重来(Digital Dream Labs收购Anki)
  15. libfdk_aac介绍
  16. ​复盘共享经济2020:陷入艰难求生困境,转型能否拯救亏损怪圈
  17. JS判断手机浏览器,并跳转到手机端网页
  18. Http请求状态码-416
  19. 面向对象之:三大特性:继承(已讲),封装,多态
  20. 高等数学(一)夹逼定理

热门文章

  1. 404!优秀案例分享,这样的页面照样能给你小惊喜
  2. “3D字体”素材|让你的设计脱颖而出,看起来与众不同
  3. App导航设计全面梳理——可临摹素材原型模版,轻松缕清思路!
  4. UI设计的扁平化图标模板素材
  5. python数据参数_python 的参数总结
  6. mysql exists依赖查询_MySQL EXISTS 和 NOT EXISTS 子查询
  7. 笔记本电脑键盘切换_有哪些好用的办公键盘
  8. Windows下利用C++实现Git自动克隆项目
  9. Linux内核跟踪eBPF:bpftrace一行教程
  10. DPDK内存篇(二): 深入学习 IOVA