用户工具

站点工具


apijson:apijson
    • APIJSONApplication.DEFAULT_APIJSON_CREATOR,APIJSONCreator是扩展点,可对APIJSON现有逻辑进行自定义
    • APIJSONApplication.init,初始化:access、function、request,Verifier校验权限和格式,FunctionParser解析函数
    • 操作方法:get查 post增 put改 delete删 head计数 gets安全查 heads安全计数,Parser.parse(json)
  • 操作方法:http请求方法必须为POST
    • get:普通获取数据,{“Moment”:{“id”:235}},响应{“Moment”:{},“code”:200,“msg”:“success”}
    • head:普通获取数量,{“Moment”:{“userId”:38710}},响应{“Moment”:{“count”:20}}
    • gets:安全获取数据,登录+角色+tag,{“tag”:“Privacy”,“Privacy”:{}}
    • heads:安全获取数量,登录+角色+tag,其他同head
    • post:新增数据,登录+角色+tag,不传id,单个{“tag”:“Comment”,“Comment”:{momentId,content}},批量{“tag”:“Comment:[]”,“Comment[]”:[{}]}
    • put:修改数据,只修改所传的字段,单个{“tag”:“Moment”,“Moment”:{“id”:235,content}},批量同post,或{“tag”:“Moment[]”,“Moment”:{“id{}”:[1,2,3],content}}
    • delete:删除数据,只传id,单个{“tag”:“Comment”,“Comment”:{id}},批量{“tag”:“Moment[]”,“Moment”:{“id{}”:[1,2,3]}}
  • {method}/{tag}:简化请求
    • gets/Privacy,{“id”:82001},简化{“tag”:“Privacy”,“Privacy”:{“id”:82001}}
    • put/Comment[],{“id{}”:[1,2],“content”:“update”},简化{“tag”:“Moment[]”,“Moment”:{“id{}”:[1,2,3],content}}
    • post/Comment,{“content”:“post”}
    • delete/Comment,{“id”:1},delete/Comment[],{“id{}”:[1,2,3]}
  • 权限+角色+Access,开放查询GET=[UNKNOWN,LOGIN],登录查询GETS=[LOGIN]
    • Access表定义访问权限:表名+method+角色列表,用户状态使用HttpSession存取,请求声明角色{“@role”:“OWNER”}
    • UNKNOWN:未登录,userId⇐0或为null
    • LOGIN:已登录,userId>0
    • OWNER:对象创建者,userId=$currentUserId,其他表有userId字段
    • CONTACT:对象创建者是当前用户的好友,userId IN( $currentContactIdList ),操作好友的数据
    • CIRCLE:OWNER+CONTACT,userId IN( $currentCircleIdList,操作自己或好友的数据,currentCircleIdList = currentContactIdList.add(currentUserId)
    • ADMIN,管理员,默认不支持,需要手动重载 verifyAdmin 方法实现
    • 表级:UNKNOWN, LOGIN, ADMIN;行级:OWNER, CONTACT, CIRCLE;列级:下划线开头可隐藏列,例如_password;
    • 新增表:表名首字母大写(mysql可配置不区分大小写)
      • 基础字段:id,bigint;userId,bigint;date,timestamp,默认current_timestamp;业务字段自定义
      • 若需要业务处理:创建实体类并继承BaseModel,若有嵌套类型如List<String>则需加上@json
      • 更新Access表,配置表访问权限;若有安全接口需求,更新Request表,配置json校验等
      • 重启,或reload,支持type=ALL|ACCESS|REQUEST|FUNCTION
  • 请求校验+Request:通常每张表需要7条规则=POST/PUT/DELETE单独+批量,查询权限在Access表GET HEAD GETS HEADS控制即可
    • version:不传、null、⇐0都会匹配最新版本,>0匹配指定版本、或比$version高的最低版本
    • method:方法,POST PUT DELETE等
    • tag:标识,通常为表名(此时structure会使用表名包裹,以与请求json对应),但也有例外(此时需完整校验)
    • structure:正文校验,{“MUST”:“必填字段”,“REFUSE”:“禁止字段”,“UPDATE”:{“@role”:“OWNER”}}
      • “MUST”:“title”,title必填
      • “REFUSE”:“id”,id禁止,为!时拒绝除MUST之外的所有字段
      • “UPDATE”:{“@role”:“OWNER”},覆盖@role为OWNER
      • “Verify”:{“key{}”:range,“key$”:“%m%”},范围,模糊,key~正则
      • “Type”:{“key”:“DATETIME”},支持URL[]
    • 注册时:tag=api_register,{“User”: {“MUST”: “username,realname”, “REFUSE”: “id”, “UNIQUE”: “username”}, “Credential”: {“MUST”: “pwdHash”, “UPDATE”: {“id@”: “User/id”}}},此时涉及多表操作,tag非表名(表名以大写字母开头)
      • “UNIQUE”:“username”,要求唯一
      • “UPDATE”: {“id@”: “User/id”},Credential引用了User的id,因此必须在后面,json的先后顺序很重要
      • ADD,REPLACE,PUT,REMOVE:{“key”:“value”},增删改查字段
    • 批量时:tag=Todo:[],{“Todo[]”: [{“MUST”: “title”, “REFUSE”: “id”}], “UPDATE”: {“@role”: “OWNER”}}
  • 远程函数+Function
    • {“name”:“Jack”,“func()”:“sayHello(name)”},func()带圆括号表示调远程函数,参数name表示引用请求里的name字段
    • public Object sayHello(@NotNull JSONObject current, @NotNull String name) throws Exception{ return current.get(name); } 返回null则不会响应,异常会终止
    • function(name,arguments,demo)values('sayHello','name','{“name”: “test”}'),需要在function声明才能调用
    • 函数可以直接查库:JSONResponse(APIJSONParser(GET, false).parseResponse(JSONRequest)).getObject(Todo.class);
    • request可以强制调函数:“UPDATE”: {“checkCanPut-()”: “isUserCanPutTodo(id)”},-表示先执行func后解析sql
  • 其他事项
    • 数据库日期时区:jdbcUrl包含serverTimezone=GMT%2B8,数据库SET global time_zone = “+8:00”; FLUSH PRIVILEGES; SELECT NOW();
    • json保持顺序问题:JSONObject.toJSONString(todoRequest, SerializerFeature.MapSortField)
    • 使用自增主键:在DemoSQLConfig里的SIMPLE_CALLBACK的newId返回null,默认取时间戳;getIdKey主键名id就好
    • 自定义鉴权:重载DemoParser的isNeedVerifyLogin, isNeedVerifyRole, isNeedVerifyContent方法
    • 不支持全量查询:DemoParser覆盖getMaxQueryCount getDefaultQueryCount,count:0时取最大值,不传时取默认值;query:2同时查数据和数量
    • 自动插入值:DemoObjectParser重写newSQLConfig,将gmt_create, create_time, creator_id, is_deleted逻辑删除等put进去
  • access:权限配置,自身支持6角色(UNKNOWN|LOGIN|CONTACT|CIRCLE|OWNER|ADMIN)+4方法(get|head)[s]访问,(get|head)s方法需要登录才能访问,head[s]方法不响应实际数据
  • get:查询语法,“@json”字段值转为json,否则为String
  • function:函数表达式为“key()”:“func(key1,key2…)“,可做参数校验、数值计算、结构变换等
apijson/apijson.txt · 最后更改: 2022/10/12 17:32 由 admin