响应转换插件
从v3.0_09000版本之后,新增了响应转换插件。该插件的作用在于允许用户通过JSON_Path语法从复杂的响应体中取出指定的响应内容。
用户可以在创建API时,在响应方向上添加这个插件。
使用说明
上下文变量
- context: 存储上下文对象
- var: 存储上下文中可以访问的变量
- headers: 存储所有 headers 信息
- raw_body: 存储 body 中元数据字符串
- body: 存储已经解析为对象的 body, 默认将
Content-Type
为application/json
解码为该对象
- func: 存储可使用的方法及函数(暂未支持)
- var: 存储上下文中可以访问的变量
可使用模板标签
{& jsonpath &}
, 输出jsonpath
表达式提取对象,返回对该对象进行JSON
编码后的结果, 如果没有匹配到任何值将会返回null
字符串
JSON Path
语法规则
JSON Path | 描述 |
---|---|
$ | 根对象或者节点 |
@ | 当前元素或者节点 |
. | 子成员操作符 |
.. | 递归查找子节点操作符 |
* | 无视名称匹配所有对象元素通配符 |
[] | 下标操作符 |
[,] | 按指定间隔提取元素操作符 |
[start\🔚step] | 数组切片操作符 |
?() | 通过静态求值脚本表达式筛选对象或元素 |
() | 脚本表达式通过静态求值 |
样例
样例数据如下:
{
"store" : {
"bicycle" : {
"color" : "red",
"price" : 19.95
},
"book" : [
{
"category" : "reference",
"author" : "Nigel Rees",
"title" : "Sayings of the Century",
"price" : 8.95
},
{
"category" : "fiction",
"author" : "Evelyn Waugh",
"title" : "Sword of Honour",
"price" : 12.99
},
{
"category" : "fiction",
"author" : "Herman Melville",
"title" : "Moby Dick",
"isbn" : "0-553-21311-3",
"price" : 8.99
},
{
"category" : "fiction",
"author" : "J. R. R. Tolkien",
"title" : "The Lord of the Rings",
"isbn" : "0-395-19395-8",
"price" : 22.99
}
]
}
}
表达式语法样例:
JSON Path | Description |
---|---|
$.store.book[*].author | store 中所有 book 的 author |
$..author | 所有 author |
$.store.* | store 中所有的对象 |
$.store..price | store 中所有对象的价格 |
$..book[2] | 通过数组下标取得第三个 book |
$..book[(@.length-1)] | 通过脚本下标取得最后一个 book |
$..book[-1:] | 获取最后一个 book |
$..book[-2:] | 获取最后两个 book |
$..book[-2:-1] | 倒数第二到最后一 的 book |
$..book[0,1] | 通过下标联合获取最前面两个 book |
$..book[:2] | 通过数组切面下标获取最开始两个 book |
$..book[?(@.isbn)] | 筛选所有包含 ISBN 的 book |
$..book[?(@.price<10)] | 筛选所有 price 小于 10 的 book |
$..book[?(@.price==8.95)] | 筛选所有 price 等于 8.95 的 book |
$..book[?(@.price<30 && @.category=="fiction")] | 筛选所有 category 等于 fiction 并且 price 小于 30 的 book |
$..* | 获取所有子对象的结构 |
转义字符
如果想避免标签进行解析,可以在标签前添加 \
字符以避免标签被进行解析
\{& &}
样例
设定 body 内容内容如下:
{
"users" : [
{ "name" : "Jane", "age" : 29 },
{ "name" : "John", "age" : 25 }
]
}
样例 1
通过下面模板转换 body:
{& context.var.body.users[0] &}
输出:
{"name":"Jane","age":29}
样例 2
通过下面模板转换 body:
{
"name" : {& context.var.body.users[*].name &},
"age" : {& context.var.body.users[*].age &}
}
输出:
{
"name" : ["Jane","John"],
"age" : [29,25]
}
注意事项
如果模板满足如下情况会出现错误
不可使用模板标签
下列标签出现在模板定义内容中将会出现错误
- {{ expression }}
- {* expression *}
- {% expression %}
- {( expression )}
- {[ expression ]}
- {- expression -}
- {# expression #}
嵌套标签
模板不支持嵌套标签