APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

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

Open WaizLee opened this issue 4 years ago • 23 comments

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

WaizLee avatar Sep 29 '21 13:09 WaizLee

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

TommyLemon avatar Sep 29 '21 14:09 TommyLemon

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

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

WaizLee avatar Sep 29 '21 15:09 WaizLee

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

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

TommyLemon avatar Sep 30 '21 06:09 TommyLemon

request配置: image 请求: image

WaizLee avatar Oct 02 '21 07:10 WaizLee

request配置: image 请求: image

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

TommyLemon avatar Oct 03 '21 06:10 TommyLemon

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

WaizLee avatar Oct 05 '21 07:10 WaizLee

@WaizLee

http://apijson.cn/api/?send=true&type=JSON&url=http%3A%2F%2Fapijson.cn%3A8080%2Fget&json=%7B%0A%20%20%20%20%22pre%22%3A%20%7B%20%20%2F%2F%20%E9%87%8C%E9%9D%A2%E9%80%9A%E8%BF%87%E5%90%8E%E7%AB%AF%20Request%20%E8%A1%A8%20UPDATE%EF%BC%8C%E5%89%8D%E7%AB%AF%E9%9C%80%E8%A6%81%E4%BC%A0%E7%A9%BA%E5%AF%B9%E8%B1%A1%20%22pre%22%3A%20%7B%7D%20%0A%20%20%20%20%20%20%20%20%22toId()%22%3A%20%22countArray(null)%22%0A%20%20%20%20%7D%2C%0A%20%20%20%20%22Comment%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22toId%40%22%3A%20%22pre%2FtoId%22%2C%20%20%2F%2F%20%E9%80%9A%E8%BF%87%E5%90%8E%E7%AB%AF%20Request%20%E8%A1%A8%20UPDATE%0A%20%20%20%20%20%20%20%20%22userId%22%3A%2082001%0A%20%20%20%20%7D%2C%0A%20%20%20%20%22%40explain%22%3A%20true%20%0A%7D

image

TommyLemon avatar Oct 12 '21 08:10 TommyLemon

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

WaizLee avatar Oct 13 '21 02:10 WaizLee

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

WaizLee avatar Oct 13 '21 09:10 WaizLee

你好,我的是插入操作,相当于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 avatar Oct 14 '21 09:10 TommyLemon

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

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

TommyLemon avatar Oct 14 '21 09:10 TommyLemon

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

WaizLee avatar Oct 15 '21 02:10 WaizLee

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

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

TommyLemon avatar Oct 15 '21 07:10 TommyLemon

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

WaizLee avatar Oct 15 '21 08:10 WaizLee

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

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

TommyLemon avatar Oct 15 '21 08:10 TommyLemon

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

WaizLee avatar Oct 15 '21 11:10 WaizLee

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

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

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

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

TommyLemon avatar Oct 15 '21 14:10 TommyLemon

这个传入的[]只是为了给我的远程函数使用的,让前端固定传入的一个值而已,但是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请求可以正常获取,看看有没类似情况

WaizLee avatar Oct 15 '21 15:10 WaizLee

这个传入的[]只是为了给我的远程函数使用的,让前端固定传入的一个值而已,但是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"

TommyLemon avatar Oct 16 '21 15:10 TommyLemon

也遇到了类似情况,这个问题现在解决了吗? @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

jianan789 avatar Jan 02 '22 06:01 jianan789

已收到!

WaizLee avatar Jan 02 '22 06:01 WaizLee

也遇到了类似情况,这个问题现在解决了吗? @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)"

TommyLemon avatar Jul 21 '22 09:07 TommyLemon

已收到!

WaizLee avatar Jul 21 '22 09:07 WaizLee

@WaizLee @jianan789 已解决 https://github.com/Tencent/APIJSON/commit/08581418850ed44449390d1404e49832bc15a488

TommyLemon avatar Nov 07 '22 08:11 TommyLemon

已收到!

WaizLee avatar Nov 07 '22 08:11 WaizLee