← 输入框|github.com|刷新
Skip to content

你好,我想了解这个类支持java方法远程调用,是出于什么场景考虑呢?感觉和整体设计上的业务逻辑前置有冲突(zuo.biao.apijson.server.RemoteFunction)。 #101

Open

Description

@710850609

环境信息

  • 系统:
  • JDK:
  • 数据库:
  • APIJSON:

问题描述

错误信息

Activity

  1. changed the title [-]你好,我想了解这个类支持java方法远程调用,是出于什么场景考虑呢?感觉和整体的业务逻辑前置有冲突(zuo.biao.apijson.server.RemoteFunction)。[/-] [+]你好,我想了解这个类支持java方法远程调用,是出于什么场景考虑呢?感觉和整体设计上的业务逻辑前置有冲突(zuo.biao.apijson.server.RemoteFunction)。[/+] on Jul 25, 2019
  2. 710850609 commented on Jul 25, 2019

    @710850609
    Author

    我稍微看了下项目,感觉整体是比较精简、干净的,没有过多的第三方依赖。
    感觉整个设计上是把现在的后台开发中(在我理解,后台=数据访问+业务逻辑)的数据层访问做了统一抽象复用。那剩下的业务逻辑也只能有两个方向处理:
    1、向前端(C端或B端)进行转移;
    2、还是后台提供,对统一抽象的数据访问接口再进一步数据加工;

    zuo.biao.apijson.server.RemoteFunction这个类提供了对java方法调用的支持,我认为是对 上述的第2中情况的支持。像 apijson.demo.server.DemoFunction#deleteChildComment,就做到了"删除评论的子评论"的支持。

    不知道我的理解和作者的设计有没有出入,文档和代码上没看得太出作者对zuo.biao.apijson.server.RemoteFunction设计的初衷。

  3. TommyLemon commented on Jul 26, 2019

    @TommyLemon
    Member

    就是第 2 种哈。
    一方面可以不用前端去做业务逻辑处理,后端写好给前端在调用 /get, /head 查询 自动化 API 直接使用:
    例如 "isPraised()":"isContain(praiseUserIdList,userId)" ,会调用 boolean isContain(JSONObject request, String array, String value) 函数,然后变为 "isPraised":true 这种(假设点赞用户id列表包含了userId,即这个User点了赞)

    image
    image
    可以写一个 boolean isContainCurrentUserId(JSONObject request, String array) 替代以上两个远程函数,简化前端调用

    image

    另一方面可以在 Request 表配置校验规则时,强制使用后端写的远程函数来校验前端调用 /post, /put, /delete 增删改 自动化 API 时传的参数:
    例如 "verifyURLList-()": "verifyURLList(pictureList)" ,会调用 Object verifyURLList(JSONObject request, String urlList) throws Exception 函数校验传过来的 pictureList 里面每项是否为 URL。
    注:接口 /get, /head 一般是不需要调用校验参数的远程函数的,这里为了方便演示用了 /get

    image
    image

  4. TommyLemon commented on Jul 26, 2019

    @TommyLemon
    Member

    3.2 功能符 远程调用函数 有说明哦
    "key()":"函数表达式",函数表达式为 function(key0,key1...),会调用后端对应的函数 function(JSONObject request, String key0, String key1...),实现 参数校验、数值计算、数据同步、消息推送、字段拼接、结构变换 等特定的业务逻辑处理,可使用 - 和 + 表示优先级,解析 key-() > 解析当前对象 > 解析 key() > 解析子对象 > 解析 key+()

    https://github.com/APIJSON/APIJSON/blob/master/Document.md#3.2

  5. 710850609 commented on Jul 26, 2019

    @710850609
    Author

    不管是从文档还是从git上面的运行代码,都没能看出具体是什么场景下使用?

    1)参数校验:是校验什么参数?入参还是出参?是像这样的校验吗:账户新增和修改,新增时账号为必填项,而修改时账号不可修改?

    2)数值计算、字段拼接、结构变换 :如果数据是从库中来的,那那通用SQL函数应该可以满足大部分需求。如果是从入参和库中数据来,那可以在客户端进行处理。
    其实这种非标准化的后台个性化方法(非项目提供),本身就是不稳定的因素,这和项目原本追求后台接口稳定是有冲突的。

    3)数据同步、消息推送:这些功能我觉得是对项目原来设计功能的扩展,这些已经超出了ORM定义的范围。
    如果支持这些功能,项目能不能提供标准化的接口,即调用入口,包括请求方法、入参、出差格式等,而具体的同步规则、推送规则,则由项目的使用者去实现。
    我觉得可以采用消息推送的方式,只产生信息,而具体的信息消费有使用者去定义,这样也能支持多机部署。

  6. 710850609 commented on Jul 26, 2019

    @710850609
    Author

    我觉得像 “数值计算、字段拼接、结构变换” 这些功能项目能否进行抽象,提供统一的方法,或是一个新的项目,作为插件式使用,增强结果输出。

    让使用者无需定义即可使用;
    如果定义的功能不满足需求其他功能,可由新版本进行发布添加;
    如果使用者觉得无需这些功能,则可以把这个增强jar去除依赖,可以达到依赖精简作用;
    如果使用者想自行开发增强功能,则实现已定义的抽象接口就好;

  7. TommyLemon commented on Aug 2, 2019

    @TommyLemon
    Member

    有太多是特定业务需求,要写特定算法,没法通用的。
    远程函数只是一种扩展,提供给后端开发者去自定义实现。

    常用的一些需求确实也可以提供对应的远程函数,DemoFunction 里就有 isContain 这种。

  8. TommyLemon commented on Nov 20, 2020

    @TommyLemon
    Member

    zuo.biao.apijson.server.RemoteFunction
    已改为
    apijson.orm.AbstractFunctionParser
    https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractFunctionParser.java

  9. TommyLemon commented on Nov 10, 2021

    @TommyLemon
    Member

    远程函数原理和使用详细讲解,可以点 Star 支持下作者哦
    https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md#远程函数和-function-表

    image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions