参数提取(extract)
基于参数提取机制实现响应结果字段提取和参数关联
在实际业务场景中,很多时候存在参数关联的情况,即当前接口请求参数来自于之前接口的响应结果。
例如,通过手机号登录的场景中,登录接口请求参数需要带上服务端预先返回的短信验证码;如果缺少这个参数关联操作,接口调用将会失败。
目前,HttpRunner 支持 2 种响应结果字段提取方式。
提取的参数变量类似于 session 参数,作用域为当前步骤及之后的步骤,引用方式与普通的变量一致。
jmespath 表达式
若响应结果为 JSON 结构,支持采用 jmespath 表达式进行参数提取。
jmespath 是一种 JSON 查询语言,可以使用非常灵活且强大的表达式查询 JSON 数据结构中的字段,并返回符合条件的数据。
针对 jmespath 官网中的示例:
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
- 查询所有城市名称:
locations[*].name
- 查询第二个城市名称:
locations[1].name
=> “New York” - 查询最后一个州名:
locations[-1].state
=> “WA”
HttpRunner 完全继承了 jmespath 的强大能力,只需要重点注意两点:
1、extract 的对象仅有 5 种类型:
- status_code:提取响应状态码,例如 200、404
- proto:提取协议类型,例如 “HTTP/2.0”、“HTTP/1.1”
- headers:从响应 headers 中提取字段,例如 headers.name
- cookies:从响应 cookies 中提取字段,例如 cookies.Token
- body:从响应 body 中提取字段,例如 body.args.foo1
2、如果表达式中存在 -
的情况,那么需要加引号处理。
例如 headers."Content-Type"
"teststeps": [
{
"name": "",
"variables": {
"name": "demo"
},
"request": {
"method": "POST",
"url": "https://www.httpbin.org",
"params": {},
"headers": {
"name": "$name",
"Content-Type": "text/plain"
},
"body": ""
},
"validate": [],
"extract": {
"name": "body.headers.Name"
}
}
]
正则表达式(regex)
若响应结果为 text/html 格式,支持采用正则表达式的方式提取目标参数。
例如响应的 body 为:
<html>
<title>参数提取(extract) | HttpRunner</title>
</html>
如果我们想提取页面的 title 字段,就可以这样做:<title>(.*)</title>
即在提取表达式中指定目标参数的左右边界,然后将目标参数替换为 (.*)
;这样我们就能将正则匹配到的值赋值给参数变量了。
"teststeps": [
{
"name": "",
"variables": {
"name": "demo"
},
"request": {
"method": "GET",
"url": "https://www.httpbin.org",
"params": {},
"headers": {
"name": "$name",
"Content-Type": "text/plain"
}
},
"validate": [],
"extract": {
"title": "<title>(.*)</title>"
}
}
]