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

能否实现请求参数进行修改后执行 #320

Open
WaizLee opened this issue Sep 29, 2021 · 25 comments
Open

能否实现请求参数进行修改后执行 #320

WaizLee opened this issue Sep 29, 2021 · 25 comments
Labels
Enhancement 增强 增强功能、提高性能等 Question 使用问题 使用问题

Comments

@WaizLee
Copy link
Contributor

WaizLee commented Sep 29, 2021

请问一下远程函数可以实现对请求参数进行修改后,再执行?比如传入的参数修改为所需要的格式在入库

@TommyLemon
Copy link
Collaborator

TommyLemon commented Sep 29, 2021

可以
"key-()":"fun(arg0,arg1..)"
https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2

@WaizLee
Copy link
Contributor Author

WaizLee commented Sep 29, 2021

我现在在request配置了一个函数,大致功能就是将数组转换为|分割的字符串,然后我想通过远程函数,将post请求内的某个参数数组,转换为|分割的字符串,在插入数据库能实现吗?

{"UPDATE":{"dealFileUrl-()":"dealFileUrl()"}},请求参数
image
远程函数:
image
,但是最后进库的还是没有转换的格式,而不是我想要的 | 分割的字符串格式,如:"test001.pdf|
test001.docx",这个是可以实现的吗

@TommyLemon
Copy link
Collaborator

TommyLemon commented Sep 30, 2021

Request 表中和这个相关的配置具体完整发出来。

如果配置没问题,需要重启服务或调 /reload。
还不行的话看下是否关闭了 Parser.isNeedVerifyContent,类似这个问题
#310

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 2, 2021

request配置:
image
请求:
image

@TommyLemon
Copy link
Collaborator

request配置: image 请求: image

你写到对象 ReviewApply 外面了,对象对应的 SQL 执行完了才会执行 dealFileUrl(),改到对象内

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 5, 2021

已经改到里面了,sql确实执行完dealFileUrl()才会生成,但是生成的还是没修改的。
image

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 13, 2021

你好,我的是插入操作,相当于Comment里面已经有toId了,但是我想让toId的数据变个格式再插入到库中。

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 13, 2021

还有个问题,远程函数用+可以让数据入库了再执行函数吗,现在测试使用了+号,返回了解析后的json对象,但是数据还没进入到库中。

@TommyLemon
Copy link
Collaborator

TommyLemon commented Oct 14, 2021

你好,我的是插入操作,相当于Comment里面已经有toId了,但是我想让toId的数据变个格式再插入到库中。

光给截图不给文本我打字都要浪费一些时间。

这里只是示例,把 toId 当成你的 document_list,放到上面对象,通过远程函数处理下,再到下面引用赋值。

"pre":{
    "document_list": [],
    "document_list()": "dealFileUrl()"   // 比 "dealFileUrl()": "dealFileUrl()"  + "document_list@": "pre/dealFileUrl" 少返回一个字段
},
"ReviewApply": {
   "document_list@": "pre/document_list",
   ...
}

@TommyLemon
Copy link
Collaborator

TommyLemon commented Oct 14, 2021

还有个问题,远程函数用+可以让数据入库了再执行函数吗,现在测试使用了+号,返回了解析后的json对象,但是数据还没进入到库中。

可以,但后面执行就只是应用业务代码中处理了,和数据库没有直接的关系。想在入库前处理按以上方式处理。
打算后续把 key-() 的执行结果放到 SQL 拼接的键值对中,简化使用,像你一开始写的那样直接用。

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 15, 2021

好的,感谢!请问一下具体怎么操作,数据入库后再执行远程函数
image
看日志是框架内事务控制了?该条数据,库内还未插入

@TommyLemon
Copy link
Collaborator

好的,感谢!请问一下具体怎么操作,数据入库后再执行远程函数 image 看日志是框架内事务控制了?该条数据,库内还未插入

就是正常地把远程函数写在表对象内,不加优先级 - 就行,增删改完后 id 值会返回,可直接用或引用赋值

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 15, 2021

id是返回了,但是远程函数执行完之前,数据不在库里。这边有个功能是需要在数据入库后查数量的,如果数据没入库,我这个远程函数调用的时候只能从请求参数获取批量插入的数量,再加上数据库现有的数量。功能可以实现,就是代码量增加了

@TommyLemon
Copy link
Collaborator

id是返回了,但是远程函数执行完之前,数据不在库里。这边有个功能是需要在数据入库后查数量的,如果数据没入库,我这个远程函数调用的时候只能从请求参数获取批量插入的数量,再加上数据库现有的数量。功能可以实现,就是代码量增加了

试试在远程函数内手动调用 parser.commit

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 15, 2021

parser对象怎么拿到?还有刚刚发现一个问题,put请求参数传入集合,到远程函数不见了,post请求正常。
请求:
image
远程函数拿到的对象:
image
replaceText不见了。。测试发现传入集合就不行了,post正常,put直接不见了,麻烦看看什么问题,谢谢

@TommyLemon
Copy link
Collaborator

TommyLemon commented Oct 15, 2021

parser对象怎么拿到?还有刚刚发现一个问题,put请求参数传入集合,到远程函数不见了,post请求正常。 请求: image 远程函数拿到的对象: image replaceText不见了。。测试发现传入集合就不行了,post正常,put直接不见了,麻烦看看什么问题,谢谢

库代码没有传,可以在自己业务项目在 DemoParser.createObjectParser 时传 this 给 DemoObjectParser 实例使用。

批量 POST/PUT 都会把 Table[]:[ {}, {}...] 拆分为多个 Table:{} 再执行,对应远程函数是怎么配置的?

截屏里的 JSON 麻烦把文本也一块发出来方便定位问题

@WaizLee
Copy link
Contributor Author

WaizLee commented Oct 15, 2021

这个传入的[]只是为了给我的远程函数使用的,让前端固定传入的一个值而已,但是put请求进来后该参数不见了。我使用post请求是可以拿到这个replaceText的。
{
"ReviewOpinion[]": [
{
"id": "1448949280413315072",
"feedback_opinion": "测试反馈001",
"editor": "jsfzr_a"
}
],
"apply_id": "1448945313356705792",
"subject_ind": 1,
"replaceText": ["test1","test2"], //这个只是让前端固定传给我的一个值,用于远程函数获取到转换为list做相关操作,目前使用put请求,到远程函数后,该参数消失不见,如果简单传入String类型或Integer类型是可以在远程函数见到的
"tag": "feedback"
}
作者可以试试在自己的项目尝试传入一个list参数,put请求该参数会消失不见,post请求可以正常获取,看看有没类似情况

@TommyLemon
Copy link
Collaborator

这个传入的[]只是为了给我的远程函数使用的,让前端固定传入的一个值而已,但是put请求进来后该参数不见了。我使用post请求是可以拿到这个replaceText的。 { "ReviewOpinion[]": [ { "id": "1448949280413315072", "feedback_opinion": "测试反馈001", "editor": "jsfzr_a" } ], "apply_id": "1448945313356705792", "subject_ind": 1, "replaceText": ["test1","test2"], //这个只是让前端固定传给我的一个值,用于远程函数获取到转换为list做相关操作,目前使用put请求,到远程函数后,该参数消失不见,如果简单传入String类型或Integer类型是可以在远程函数见到的 "tag": "feedback" } 作者可以试试在自己的项目尝试传入一个list参数,put请求该参数会消失不见,post请求可以正常获取,看看有没类似情况

这个 bug 应该是 AbstractObjectParser.onPutArrayParse 当 isTable == false 时没有调用 sqlRequest.put(realKey, targetArray); 导致

image
image

可以加上这句,改了测试没问题后建议提交 PR 贡献代码,会把你加到 APIJSON 贡献者列表中
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

或者前端可以把 JSONArray 转为 String 传参 "replaceText": "["test1","test2"]",也可以直接用逗号分隔 "replaceText": "test1,test2"

@jianan789
Copy link

也遇到了类似情况,这个问题现在解决了吗? @TommyLemon
流程描述:在post写入数据时候,request表配置 update规则,调用自定义函数,自定义函数会修改JSONObject current加工指定字段。
自定义函数触发也成功修改了对应字段,发现写入到数据库数据并没有改变。

request配置
{"INSERT": {"tag": [], "@role": "OWNER"}, "REFUSE": "id", "UPDATE": {"transformGeoHash-()":"transformGeoHash(geoHash,cityCode)"}}

function自定义函数

public Object transformGeoHash(@NotNull JSONObject current,@NotNull String geoHash,@NotNull String cityCode){
		if (current != null && current.containsKey("latitude") && current.containsKey("longitude")){
			String geoHashVal = GeoHashUtils.encode(current.getDoubleValue("latitude"),current.getDoubleValue("longitude"));
			current.put(geoHash,geoHashVal);
			current.put(cityCode,"100000");
		}
		return null;
	}

image

@WaizLee
Copy link
Contributor Author

WaizLee commented Jan 2, 2022 via email

@TommyLemon
Copy link
Collaborator

也遇到了类似情况,这个问题现在解决了吗? @TommyLemon 流程描述:在post写入数据时候,request表配置 update规则,调用自定义函数,自定义函数会修改JSONObject current加工指定字段。 自定义函数触发也成功修改了对应字段,发现写入到数据库数据并没有改变。

request配置 {"INSERT": {"tag": [], "@role": "OWNER"}, "REFUSE": "id", "UPDATE": {"transformGeoHash-()":"transformGeoHash(geoHash,cityCode)"}}

function自定义函数

public Object transformGeoHash(@NotNull JSONObject current,@NotNull String geoHash,@NotNull String cityCode){
		if (current != null && current.containsKey("latitude") && current.containsKey("longitude")){
			String geoHashVal = GeoHashUtils.encode(current.getDoubleValue("latitude"),current.getDoubleValue("longitude"));
			current.put(geoHash,geoHashVal);
			current.put(cityCode,"100000");
		}
		return null;
	}

image

可以改成两个远程函数键值对,都 return 对应值

"cityCode-()":"getCityCode()",
"geoHash-()":"transformGeoHash(geoHash,cityCode)"

@WaizLee
Copy link
Contributor Author

WaizLee commented Jul 21, 2022 via email

@TommyLemon
Copy link
Collaborator

@WaizLee @jianan789 已解决
0858141

@WaizLee
Copy link
Contributor Author

WaizLee commented Nov 7, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Enhancement 增强 增强功能、提高性能等 Question 使用问题 使用问题
Projects
None yet
Development

No branches or pull requests

3 participants