远程函数对request的修改不生效
Demo项目里自带一个removeKey函数,其描述是“从对象里移除 key”

在使用中发现,其移除未生效:
从返回的sql语句看,name字段没被移除。
于是我debug了一下,发现removeKey函数确实移除了name字段。

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

是个 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}

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}

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

目前可以把远程函数写在最前面执行来简单解决这个问题
已解决 https://github.com/Tencent/APIJSON/commit/08581418850ed44449390d1404e49832bc15a488
5.2版本
1、 继承 APIJSONParser
2、重载 executeSQL方法
执行sql语句之前, 进行替换

5.2版本 1、 继承 APIJSONParser
![]()
2、重载 executeSQL方法 执行sql语句之前, 进行替换
![]()
感谢分享解决方案~
已解决 0858141
看了作者的源码实现
就是把 request 改成了 sqlRequest 😂
为啥要传递 sqlRequest, 后面通过 sqlRequest生成column、value, 然后将数据组装sql插入数据库

@cloudAndMonkey 是这样,request 放的是前端传参的原始键值对,sqlRequest 是封装用来生成 SQL 的键值对。
大家提的 bug,有的就是只改一两行代码,甚至只是改个单词或者标点符号就解决了。 只是我实在时间精力有限,改完还得再回归测试、提交代码等。 所以小问题大家也可以帮忙提个 PR,有的问题我也会提供解决方案。 开源要大家一起参与贡献才会更美好~
https://github.com/Tencent/APIJSON/issues/462 https://github.com/Tencent/APIJSON/issues/425 https://github.com/Tencent/APIJSON/issues/416 https://github.com/Tencent/APIJSON/issues/393

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