JSON数据接口
rxModels 提供了五个通用JSON接口,用这个五个接口,可以完成增、删、查、改、上传等功能。
接口输入时JSON格式数据,输出也是JSON格式数据。
可以用指令(格式 @directive)的方式扩展接口,指令支持热拔插,您可以定义自己指令插入到系统里。
接口测试#
直接在客户端界面,输入JSON格式的请求,就可以查询或者修改数据。

/get/...#
数据查询接口。
JSON格式的查询参数,编码成url格式,使用 web 请求的 get method 查询。
相比把参数放进Post method 的 body 里,get 有个明显的是优势,就是可以使用基于url的缓存,比如 rxmodels-swr 使用就是 SWR。可以充分使用SWR的缓存机制。
请求格式#
{ "entity @directive": "EntityName", "@directive": true, "condition @directive": "xx", "relationName":{ ... }}请求中,以 @ 开头的就是指令。指令是扩展接口的灵活方式,以后会有越来越多的指令被开发出来。
简单示例#
分页查询 RxUser 实体,每页2条数据,附带关联 roles 信息。
{ "entity": "RxUser", "roles": {}, "@paginate":[2,0]}其中@paginate是一条指令用于分页,目前的版本支持把@paginate指令放在 entity 后面。
{ "entity @paginate(2, 0)": "RxUser", "roles": {}}这两个请求的查询结果是一样的,目前还不确定哪种方式更好,还是两种方式都需要保留。
给查询添加条件#
{ "entity": "RxUser", "roles": {}, "@paginate": [2,0], "name @like": "%水%"}添加 name 条件跟指令 @like 可以查询名字中包含文字“水”的RxUser实例。
如果想让 RxRole 的 name 字段包含“风”,可以这么写:
{ "entity": "RxUser", "@paginate": [2,0], "name @like": "%水%", "roles": { "name @like": "%风%" }}这个查询会返回所有名字包含“水”的 RxUser,并附带名字中包含“风”的RxRole。
如果要剔除 RxRole 名字中不包含“风”的 RxUser,这个查询是满足不了要求的,需要用到更复杂的 where 指令:
{ "entity": "RxUser", "@paginate": [2,0], "name @like": "%水%", "roles": {}, "@where": "roles.name like '%风%'"}@where 是内置指令,不写 @ 也能被识别,不过不建议这样做。
@where 指令支持类似与 SQL 的 where语句的语法。
关系里面,有个跟 @where 指令类似的 @on指令,使用这个指令,可以把上面的例子(就是第二个例子)改为:
{ "entity": "RxUser", "@paginate": [2,0], "name @like": "%水%", "roles": { "@on": "name like '%风%'" }}条件指令#
可以附加到条件上的指令。既可以附加到实体条件上,也可以附加到关系条件上。
@equal: 如果条件不显式指定,默认就是这个指令。@between: 接受数组参数如:[2, 5]@like: 跟SQL的 like 一致
实体指令#
可以附加到实体上的指令,目前支持前面提到的两种附加方式。
@getOne: 只取第一条记录@getMany: 取多条记录,如果条件不显式指定,默认就是这个指令@orderBy: 排序指令,参数格式:{"name":"ASC", "email": "DESC"}@paginate: 分页指令,参数格式:[coustPerPage, pageIndex]@select: 选择要获取的字段,参数格式:["name", "email"...]@skip: 跳过指定数量的记录,参数格式:count@take: 取指定数量的记录,参数格式:count@tree: 如果实体支持树形结构,返回一棵树。注意只能在支持树形结构的实体上使用该指令。@where: 复杂条件指令,支持 SQL 格式字符串,不要担心安全问题,只是伪 SQL,后端会解析成其它人不容易理解的数据结构,并过滤掉SQL注入攻击。
关系指令#
可以附加到关系上的指令。
@count: 只取关联数量,不取具体数@on: 类似于SQL 的 on@orderBy: 排序,同实体 orderBy指令@select: 同实体 select指令@take: 同实体 take指令
/post#
数据提交接口,通过 web post method发送请求。
该接口有新建跟更新两个功能,如果传入的数据有 id 字段,则更新,反之新建。
请求格式#
{ "EntityName @directive(arg...)": [ { "id": 1, "field": "Field value1" ... }, { "field": "Field value2", "relations @directive(arg...)":[ 3,4, { "field": "Relation field value" } ] ... } ], "EntityName @directive(arg...)":{ ... }}跟 get 接口一样,以 @ 开头的是指令,您可以开发自己的指令来扩展接口。
指令可以附加在实体名称后面,也可以附加在关系名称后面。附加在实体后面的指令,也可以附加在关系后面。反之,则不然。
可以一次传输一条数据,也可以一次传输多条数据。
现在的指令还有点少,希望以后能多发开发一些指令,比如邮件服务的 @email 指令,已经在开发计划中了。
普通指令#
可以附加到关系跟实体上的指令。
ignoreEmperty: 如果字段值为空(null, "", undefined),则会略该字段。格式:ignoreEmperty(field1, field2...)bcrypt: 对字段加密,主要用于用户密码。格式:bcrypt(field1, field2...)
关系指令#
只能附加到关系上的指令。
cascade: 如果关系数据被删除,级联删除关联的对象。
/update#
批量更新某些字段。通过 web post method发送请求。
请求格式#
{ "EntityName1":{ "name":"张三", "email":"zhangsan@rxdrag.com", "ids":[2,3,5] }, "EntityName2":{ ... }}基于安全方面因素考虑,update 目前不支持条件,只通过 ids 字段传递一个ID数组。
update 目前不需要指令。
/delete#
根据提供的 ID,删除数据。通过 web post method发送请求。
请求格式#
{ "EntityName1 @cascade(pages, auths)":[2,3,5], "EntityName2":7, ...}指令#
目前仅支持一个指令 @cascade.
@cascade: 级联删除关联的对象,格式:@cascade(relations1, relations2...)
/upload#
上传文件,通过 web post method发送请求。
指令还在开发中...
请求格式#
{ "entity":"RxMedia", "file":... "folder":1}目前仅需要支持RxMedia实体。
where指令支持的运算符#
!, ^ , *, /, %, +, -, =, <, >, <=, >=, !=, NOT, BETWEEN, IN, IS, LIKE, AND, OR自定义指令#
写一个自定义指令,是一件非常有挑战性的工作,所以这部分还没写:),敬请期待...