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

远程函数对request的修改不生效 #426

Closed
aldag opened this issue Jul 22, 2022 · 8 comments
Closed

远程函数对request的修改不生效 #426

aldag opened this issue Jul 22, 2022 · 8 comments
Labels

Comments

@aldag
Copy link

aldag commented Jul 22, 2022

Demo项目里自带一个removeKey函数,其描述是“从对象里移除 key”
image

在使用中发现,其移除未生效:
image
从返回的sql语句看,name字段没被移除。

于是我debug了一下,发现removeKey函数确实移除了name字段。
image
image

以上情况令人迷惑。removeKey函数不是这么用得吗?远程调用函数的“字段拼接、结构变换”怎么实现呢?
image

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jul 22, 2022

是个 bug,可能是反射调用,对 request 传的不是引用而是 clone 的值
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractFunctionParser.java#L204-L206

但是对返回的结果又生效

http://apijson.cn/api/?send=true&type=JSON&url=http%3A%2F%2Fapijson.cn%3A8080%2Fget&json={%22User%22:{}}&random=User%2Fid%3A%20RANDOM_INT(82001%2C%2082020)%20%20%2F%2F%20%E9%9A%8F%E6%9C%BA%E6%95%B4%E6%95%B0%0A%5B%5D%2Fcount%3A%20RANDOM_IN(5%2C%2010%2C%20%27s%27%2C%20false%2C%20%5B%5D%2C%20%7B%7D)%20%20%2F%2F%20%E9%9A%8F%E6%9C%BA%E5%8F%96%E5%80%BC%0A%5B%5D%2Fpage%3A%20Math.round(5*Math.random())%20%20%2F%2F%20%E9%80%9A%E8%BF%87%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%87%AA%E5%AE%9A%E4%B9%89%0A%40explain%3A%20ORDER_IN(true%2C%20false)%20%20%2F%2F%20%E9%A1%BA%E5%BA%8F%E5%8F%96%E5%80%BC%0A%20%20%2F%2F%20%E4%BB%8E%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9A%8F%E6%9C%BA%E5%8F%96%E5%80%BC%20%20%5B%5D%2FComment%2FtoId%3A%20RANDOM_DB()%0A%0A%20%20%2F%2F%20%E6%B3%A8%E9%87%8A%E5%8F%AF%E7%9C%81%E7%95%A5%EF%BC%8C%E4%BD%86%E5%A6%82%E6%9E%9C%E6%9C%AA%E7%9C%81%E7%95%A5%E5%88%99%E5%89%8D%E9%9D%A2%E4%B8%A4%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%BF%85%E9%A1%BB%EF%BC%9B%E6%B8%85%E7%A9%BA%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9%E5%8F%AF%E6%9F%A5%E7%9C%8B%E8%A7%84%E5%88%99%E3%80%82%0A%0A%20%20%2F%2F%20%23%23%20%E5%BF%AB%E6%8D%B7%E9%94%AE%0A%20%20%2F%2F%20Ctrl%20%2B%20I%20%E6%88%96%20Command%20%2B%20I%20%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%96%87%E6%9C%AC%EF%BC%8C%E6%B8%85%E9%99%A4%E6%89%80%E6%9C%89%E6%B3%A8%E9%87%8A%E5%92%8C%E6%97%A0%E6%95%88%E7%A9%BA%E6%A0%BC%E3%80%81%E6%8D%A2%E8%A1%8C%E7%AD%89%EF%BC%9B%0A%20%20%2F%2F%20Ctrl%20%2B%20%2F%20%E6%88%96%20Command%20%2B%20%2F%20%E5%AF%B9%E9%80%89%E4%B8%AD%E8%A1%8C%20%E6%96%B0%E5%A2%9E%E8%A1%8C%E6%B3%A8%E9%87%8A%20%E6%88%96%20%E5%8F%96%E6%B6%88%E8%A1%8C%E6%B3%A8%E9%87%8A%EF%BC%9B&setting={%22requestVersion%22:3,%22requestCount%22:1,%22isTestCaseShow%22:false,%22isRandomListShow%22:false,%22isCrossEnabled%22:false,%22isMLEnabled%22:true,%22isDelegateEnabled%22:false,%22isPreviewEnabled%22:false,%22isEncodeEnabled%22:true,%22isEditResponse%22:false,%22page%22:0,%22count%22:100,%22testCasePage%22:0,%22testCaseCount%22:100,%22testRandomCount%22:1,%22randomPage%22:0,%22randomCount%22:50,%22randomSubPage%22:0,%22randomSubCount%22:50}
image

http://apijson.cn/api/?send=true&type=JSON&url=http%3A%2F%2Fapijson.cn%3A8080%2Fget&json={%22User%22:{%22remove()%22:%22removeKey(name)%22}}&random=User%2Fid%3A%20RANDOM_INT(82001%2C%2082020)%20%20%2F%2F%20%E9%9A%8F%E6%9C%BA%E6%95%B4%E6%95%B0%0A%5B%5D%2Fcount%3A%20RANDOM_IN(5%2C%2010%2C%20%27s%27%2C%20false%2C%20%5B%5D%2C%20%7B%7D)%20%20%2F%2F%20%E9%9A%8F%E6%9C%BA%E5%8F%96%E5%80%BC%0A%5B%5D%2Fpage%3A%20Math.round(5*Math.random())%20%20%2F%2F%20%E9%80%9A%E8%BF%87%E4%BB%A3%E7%A0%81%E6%9D%A5%E8%87%AA%E5%AE%9A%E4%B9%89%0A%40explain%3A%20ORDER_IN(true%2C%20false)%20%20%2F%2F%20%E9%A1%BA%E5%BA%8F%E5%8F%96%E5%80%BC%0A%20%20%2F%2F%20%E4%BB%8E%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9A%8F%E6%9C%BA%E5%8F%96%E5%80%BC%20%20%5B%5D%2FComment%2FtoId%3A%20RANDOM_DB()%0A%0A%20%20%2F%2F%20%E6%B3%A8%E9%87%8A%E5%8F%AF%E7%9C%81%E7%95%A5%EF%BC%8C%E4%BD%86%E5%A6%82%E6%9E%9C%E6%9C%AA%E7%9C%81%E7%95%A5%E5%88%99%E5%89%8D%E9%9D%A2%E4%B8%A4%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%BF%85%E9%A1%BB%EF%BC%9B%E6%B8%85%E7%A9%BA%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9%E5%8F%AF%E6%9F%A5%E7%9C%8B%E8%A7%84%E5%88%99%E3%80%82%0A%0A%20%20%2F%2F%20%23%23%20%E5%BF%AB%E6%8D%B7%E9%94%AE%0A%20%20%2F%2F%20Ctrl%20%2B%20I%20%E6%88%96%20Command%20%2B%20I%20%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%96%87%E6%9C%AC%EF%BC%8C%E6%B8%85%E9%99%A4%E6%89%80%E6%9C%89%E6%B3%A8%E9%87%8A%E5%92%8C%E6%97%A0%E6%95%88%E7%A9%BA%E6%A0%BC%E3%80%81%E6%8D%A2%E8%A1%8C%E7%AD%89%EF%BC%9B%0A%20%20%2F%2F%20Ctrl%20%2B%20%2F%20%E6%88%96%20Command%20%2B%20%2F%20%E5%AF%B9%E9%80%89%E4%B8%AD%E8%A1%8C%20%E6%96%B0%E5%A2%9E%E8%A1%8C%E6%B3%A8%E9%87%8A%20%E6%88%96%20%E5%8F%96%E6%B6%88%E8%A1%8C%E6%B3%A8%E9%87%8A%EF%BC%9B&setting={%22requestVersion%22:3,%22requestCount%22:1,%22isTestCaseShow%22:false,%22isCrossEnabled%22:false,%22isMLEnabled%22:true,%22isDelegateEnabled%22:false,%22isPreviewEnabled%22:false,%22isEncodeEnabled%22:true,%22isEditResponse%22:false,%22page%22:0,%22count%22:100,%22testCasePage%22:0,%22testCaseCount%22:100,%22testRandomCount%22:1,%22randomPage%22:0,%22randomCount%22:50,%22randomSubPage%22:0,%22randomSubCount%22:50}
image

@TommyLemon
Copy link
Collaborator

request 已经解析完了,作为和数据库 SQL 直接相关的都存到 sqlRequest 对象了,所以移除 request 里面的 key 没用,得再加上移除 sqlRequest 的代码
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java#L483
image

@TommyLemon
Copy link
Collaborator

TommyLemon commented Aug 8, 2022

目前可以把远程函数写在最前面执行来简单解决这个问题

@TommyLemon TommyLemon added the help wanted 请求帮助 label Sep 25, 2022
@TommyLemon
Copy link
Collaborator

已解决
0858141

@cloudAndMonkey
Copy link
Contributor

5.2版本
1、 继承 APIJSONParser
image
image
2、重载 executeSQL方法
执行sql语句之前, 进行替换
image
image

@TommyLemon
Copy link
Collaborator

5.2版本 1、 继承 APIJSONParser image image 2、重载 executeSQL方法 执行sql语句之前, 进行替换 image image

感谢分享解决方案~

@cloudAndMonkey
Copy link
Contributor

已解决 0858141

看了作者的源码实现
就是把 request 改成了 sqlRequest 😂
image
为啥要传递 sqlRequest, 后面通过 sqlRequest生成column、value, 然后将数据组装sql插入数据库
image
image
image
image

@TommyLemon
Copy link
Collaborator

TommyLemon commented Nov 18, 2022

@cloudAndMonkey 是这样,request 放的是前端传参的原始键值对,sqlRequest 是封装用来生成 SQL 的键值对。

大家提的 bug,有的就是只改一两行代码,甚至只是改个单词或者标点符号就解决了。
只是我实在时间精力有限,改完还得再回归测试、提交代码等。
所以小问题大家也可以帮忙提个 PR,有的问题我也会提供解决方案。
开源要大家一起参与贡献才会更美好~

image

#462
#425
#416
#393

image

https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%80%E5%AE%9A%E8%A6%81%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants