Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
710850609 opened this issue Jul 25, 2019 · 8 comments
Labels
Business Logic 业务逻辑 各种自定义业务逻辑处理通过 远程函数 来实现 Document 文档 文档 Question 使用问题 使用问题 RFC 远程函数调用

Comments

@710850609
Copy link

环境信息

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

问题描述

错误信息

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

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

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

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

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jul 26, 2019

就是第 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

@TommyLemon
Copy link
Collaborator

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

@710850609
Copy link
Author

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

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

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

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

@710850609
Copy link
Author

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

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

@TommyLemon
Copy link
Collaborator

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

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

@TommyLemon
Copy link
Collaborator

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

@TommyLemon
Copy link
Collaborator

TommyLemon commented Nov 10, 2021

远程函数原理和使用详细讲解,可以点 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
Labels
Business Logic 业务逻辑 各种自定义业务逻辑处理通过 远程函数 来实现 Document 文档 文档 Question 使用问题 使用问题 RFC 远程函数调用
Projects
None yet
Development

No branches or pull requests

2 participants