如何在Wiremock响应模板中提取URL编码JSON数组首个值
提取Wiremock中URL编码JSON数组查询参数的第一个值
问题背景
请求URL:http://myserver:8080/api/userinfo?Logins=%5B%22admin%40my.domain%22%5D,需在Wiremock响应模板中提取Logins查询参数里URL编码JSON数组的第一个值。
已尝试以下模板配置:
{ "response": { "jsonBody": { "logins": "{{request.query.Logins}}", "jsonPathLogins": "{{jsonPath request.query.Logins '$'}}", "jsonPathLogins0": "{{jsonPath request.query.Logins '$.[0]'}}", "jsonPathQueryLogins": "{{jsonPath request.query '$.Logins'}}", "jsonPathQueryLogins0": "{{jsonPath request.query '$.Logins.[0]'}}", "loginsCut": "{{cut request.query.Logins.[0] '\"'}}", "loginsCutQuot": "{{cut request.query.Logins.[0] '"'}}", "loginsReplace": "{{replace request.query.Logins.[0] '\"' '*'}}", "loginsReplaceQuot": "{{replace request.query.Logins.[0] '"' '*'}}" } } }
但返回结果始终无法正确提取数组元素:
{ "logins": "["admin@my.domain"]", "jsonPathLogins": "["admin@my.domain"]", "jsonPathLogins0": "["admin@my.domain"]", "jsonPathQueryLogins": "["admin@my.domain"]", "jsonPathQueryLogins0": "["admin@my.domain"]", "loginsCut": "["admin@my.domain"]", "loginsCutQuot": "["admin@my.domain"]", "loginsReplace": "["admin@my.domain"]", "loginsReplaceQuot": "["admin@my.domain"]" }
问题原因
request.query.Logins获取到的是URL解码后的字符串(带HTML转义引号),本质是JSON数组的字符串形式,但Wiremock默认不会自动将该字符串解析为JSON对象。直接使用jsonPath操作时,只会把整个字符串当作单个节点处理,无法识别为数组,因此取不到数组元素。
解决方案
需要先将字符串解析为JSON对象,再用jsonPath提取元素,结合Wiremock模板的parseJson函数实现:
基础版本(无HTML转义)
如果request.query.Logins实际值为["admin@my.domain"],直接解析即可:
{ "response": { "jsonBody": { "firstLogin": "{{jsonPath parseJson(request.query.Logins) '$[0]'}}" } } }
处理HTML转义版本
如果返回中存在"这类HTML转义字符,需要先用unescapeXml函数转义,再解析:
{ "response": { "jsonBody": { "firstLogin": "{{jsonPath parseJson(unescapeXml(request.query.Logins)) '$[0]'}}" } } }
说明
unescapeXml(request.query.Logins):将带HTML转义的字符串还原为标准JSON字符串,比如["admin@my.domain"]转为["admin@my.domain"]parseJson(...):将JSON字符串解析为JSON数组对象jsonPath(...) '$[0]':提取数组的第一个元素,最终得到admin@my.domain
内容的提问来源于stack exchange,提问作者Eduard Sukharev
相关产品推荐
相关产品推荐

