基本语法结构
SQLRestful由服务配置、接口定义两部分构成,其中服务配置包括名称、概述、版本、作者、数据库连接、缓存连接等,接口定义又分为两层结构:路径定义与方法定义。
服务配置
//描述信息
_meta {
  //名称
  name = "SQLRestful"
  //版本
  version = "1.0"
  //描述
  desc = "SQLRestful,您的云原生应用生产力工具!"
  //作者
  author {
    //姓名
    name = "痞子飞猪"
    //邮箱
    email  = "13317312768@qq.com"
  }
  //数据库配置
  db {
    //数据库驱动名
    driver = "sqlite3"
    //数据库连接
    dsn = "sqlte3.db?create=true"
    //Redis缓存连接
    redis = "redis://:password@<redis host>:6379/0"
  }
  //安全配置
  security {
    //统一用户安全服务地址
    api = "https://snz1.cn/test/xeai"
    //用户标识头
    from = "iv-user"
    //用户标识类型
    idtype = "uname"
    //组织域范围
    scope = "employee"
  }
  //应用身份配置:JWT请求令牌
  jwt = {
    //应用私钥(PEM格式)
    rsa = <<PEM
    ....
    PEM
    //应用密钥(安全令牌)
    secret = ""
    //请求令牌超时事件(秒)
    expires = 1800
  }
  //常量定义
  const {
    //...
  }
  //消息插件配置
  mq {
    //消息插件
    driver = "stomp"
    //消息连接
    url = "tcp://stomp_host:61613"
  }
}
服务配置项说明
name
服务名称定义
version
服务实现版本
desc
服务实现描述
author
服务维护人员,包括名称(name)、邮件(email)、网址(url)属性。
db
服务数据库连接配置,包括驱动(driver)、连接(dsn)、Redis缓存(redis)属性。
security
统一安全服务接口配置,包括服务接口地址(api)、用户标识请求头(from)、用户标识类型(idtype)、组织域范围(scope)属性。
jwt
应用身份配置,包括RSA私钥(rsa)、协商密钥(secret)、令牌超时时间(expires)等属性。
const
全局常量配置表,键值为js表达式。
mq
消息服务配置,包括消息插件名称(driver)、消息连接地址(url)等属性。
接口定义
路径定义语法
//接口名称,不能包含“\”、“/”、“:”等特殊字符
api {
  //接口地址,省略时使用接口定义名称作为接口地址,可使用“:变量”方式定义路径变量
  path = "/path/of/object_items"
  //服务接口的分类标签(可忽略)
  tags = ["标签"]
  //摘要描述(可忽略)
  desc = ""
  //常量定义
  const {
    ...
  }
  //接口GET请求方法
  get {
   ... //方法定义
  }
  //POST请求方法
  post {
    ... //方法定义
  }
  //PUT请求方法
  put {
    ... //方法定义
  }
  //PATCH请求方法
  patch {
    ... //方法定义
  }
  //DELETE请求方法
  delete {
    ... //方法定义
  }
}
当路径定义只有一种方法实现可以直接使用
方法定义语法来简化接口定义:
api_name {
  path = "/path/of/api"
  //可省略,默认为`GET`
  methods = [ "GET" ]
  //参见【方法定义语法】
}
方法定义语法
// method只能为:get、post、put、patch、delete
method {
  //服务接口的分类标签(用于swagger文档输出,可忽略),可继承自上级定义
  tags = ["标签"]
  //摘要描述(用于swagger文档输出,可忽略)
  desc = ""
  //预先执行其他接口:接口列表
  include = ["_boot"]
  //校验表达式:JS脚本实现
  validators {
    value = "express value" //表达式为真表示校验通过
  }
  //身份验证:返回true表示身份验证通过(可忽略)
  authorizer = <<JS
    (function(){
      user_name = $input.http_iv_user
      ...
      return true
    })()
  JS
  //安全验证配置:需要运行时配置统一安全验证服务地址
  //安全配置默认自上层定义中继承
  security {
    //是否允许匿名访问,为true时不判定用户身份
    anonymous = false
    //用户所属组织域:参见<https://snz1.cn/k8s/javadoc/sc-client-api/doc/org/scope.html>
    scope = "employee"
    //判定角色列表
    roles = [ "ADMIN" ]
    //判定用户列表
    users = [ "neeker" ]
    //角色或用户判定策略:
    //      为allow时表示请求用户必须包含roles中定义的角色、用户必须在users定义的列表中
    //      为deny时表示请求用户不能是roles定义的角色、用户不能再users定义的列表中
    //条件不满足则返回403应答
    policy = "allow"
  }
  //Redis缓存配置(无redis连接配置时无效)
  cache {
    //缓存名称列表(HSET):使用input作为field主键
    put = ["cache_name"]
    //移除缓存(HSET):删除HSET主键
    evit = ["cache_name"]
  }
  //表示total与exec的脚本类型:sql(默认),js(JavaScript),cmd(命令)
  impl = "sql"
  //SQL执行变量绑定,impl = "sql"时生效
  bind {
    sql_param1 = "$input.id"     //JS脚本
    sql_offset = "$input.offset" //默认为0
    sql_limit = "$input.limit"   //默认为0
  }
  //提供待执行的脚本(JS):存在则忽略total、exec的定义
  provider = <<JS
  (function(){
    if ($result = "total") {
      return "..."
    } else {
      return "..."
    }
  })()
  JS
  //分页对象的总记录数,此属性存在则result类型强制为page
  total = <<SQL
    select count(*) from
  SQL
  //返回数据的执行SQL
  exec = <<SQL
    select * from your_table where id = :id offset :sql_offset limit :sql_limit
  SQL
  //转换为最终输出的JSON对象:JS语法,应当包含一个JS闭包函数
  transformer = <<JS
    (function(){
        //$result表示
        $new = [];
        for ( i in $result ) {
            $new.push($result[i].Database)
        }
        return $new
    })()
  JS
  //返回类型:object表示对象、list表示列表、page表示分页。
  result = "object"
  //应答格式,enclosed表示接口返回信封封装(默认),origin表示原样返回(不封装)
  //nil表示不返回数据(仅返回封装头),redirect表示跳转到返回地址
  format = "enclosed"
  //执行并组合其他接口返回值,存在则忽略其他定义
  aggregate = [ ... ]
  //定义Websocket接口
  websocket {
    //是否启用
    enabled = true
    //握手超时时间
    handshakeTimeout = 60
    //保持会话秒
    keepalive = 25
    //读取缓冲区大小
    readBufferSize = 512
    //写入缓冲区大小
    writeBufferSize = 512
    //是否默认启用压缩
    compression = true
    //子协议数组
    subprotocols = [ ... ]
    //允许的请求源正则表达式数组
    origins = [...]
  }
  //映射的静态目录
  dir = "/path/to/directory"
  //映射的静态文件
  file = "/path/to/file"
}
接口定义项说明
接口名称
以英语字母开头的英文名称,后面可以是字母、数字或_,不能包含:、/、\、-等特殊字符。
path
表示接口路径,可以使用:开头作为路径变量,每个路径变量只能匹配一层路径,如:
/users/:id/name
tags
文档归类标签列表,可以把多个不同的接口规定到同一个文档标签下展示,仅用于SwaggerUI。
desc
接口实现概述,仅用于SwaggerUI。
const
常量列表定义,此处定义的常量在js脚本可通过$const.xxx方式获取到。常量值可以是js表达式或js脚本。
get
仅在路径定义中有效,表示定义指定路径的GET方法实现。
post
仅在路径定义中有效,表示定义指定路径的POST方法实现。
put
仅在路径定义中有效,表示定义指定路径的PUT方法实现。
patch
仅在路径定义中有效,表示定义指定路径的PATCH方法实现。
delete
仅在路径定义中有效,表示定义指定路径的DELETE方法实现。
include
执行其他接口实现。
validators
验证表达式,每个定义的验证配置项必须返回true,否则返回422应答。
authorizer
使用js实现身份验证。
security
统一用户安全配置,包括可否匿名访问(anonymous)、定义组织域(scope)、定义角色列表(roles)、定义用户列表(users)、判定策略(policy)等配置。
- policy为- allow时表示允许定义的角色或用户访问;
- policy为- deny时表示不允许定义的角色或用户访问;
cache
接口缓存配置,包括设置缓存列表(put)或清理缓存列表(evit)。
impl
表示接口的exec与total实现脚本类型:
- 为sql时表示SQL查询语句(默认)
- 为js时表示JavaScript脚本
- 为cmd时表示命令行及参数
bind
impl为sql时表示exec中的SQL查询命名绑定参数。
bind也为SwaggerUI提供输入参数的定义描述。
total
存在时表示接口为分页接口,并返回查询记录总数。
exec
服务接口实现脚本
transformer
用于转换exec执行返回的数据,采用js脚本实现。
result
定义数据类型,object表示对象、list表示列表、page表示分页(total存在时强制为page)。
format
定义应答格式,enclosed表示信封封装、origin表示原样返回、nil表示只返回封装头。
aggregate
组合其他接口定义执行返回。
websocket
定义接口是否为websocket服务,当启用了websocket服务时,接口定义的脚本在客户端消息到达时被执行。
dir
定义静态文件目录路由,存在时忽略其他配置,只返回目标文件夹中的静态文件。
file
定义静态文件路由,存在时忽略其他配置,只返回目标静态文件。