无法通过JSON提取器提取响应ID并在后续请求使用的报错问题
咱先明确问题根源:你遇到的报错是因为JSON提取器没有成功把id值提取出来,所以删除请求里的${id}根本没被替换成实际的数字(比如返回里的82),而是原封不动留在URL里,导致URL变成了http://dummy.restapiexample.com/api/v1/delete/${id}——这里的${}属于URI里的非法字符,自然就触发了URISyntaxException。
下面一步步来排查和解决:
1. 核对JSON提取器的配置细节
先检查你的JSON提取器是不是配错了,针对你给出的响应内容,正确配置应该是这样的:
- Reference Name:填
id(就是你后续要用的变量名${id}) - JSON Path Expression:必须填
$.data.id(因为返回的JSON里,id是嵌套在data对象里的,路径不能错) - Match No.:填
1(这里只有一个id结果,取第一个就行) - Default Value:可以填
NOT_FOUND(方便你排查,如果没提取到变量就会显示这个值)
2. 验证变量是否真的被提取到
给测试计划加一个Debug Sampler,放在JSON提取器所在的请求后面,运行测试后看Debug的响应结果:
- 如果看到
id=82,说明提取成功了; - 如果看到
id=NOT_FOUND,那肯定是JSON Path写错了,再仔细核对响应的JSON结构:
确认路径是{"status":"success","data":{"name":"chirag","salary":"1000","age":"30","id":82}}$.data.id,别写成$.id或者其他错误路径。
3. 检查删除请求的URL配置
确保删除请求的URL是这么写的:http://dummy.restapiexample.com/api/v1/delete/${id}
注意别给${id}加引号,也别多打空格或者符号,就是直接拼在路径末尾。另外,确认请求的Implementation选的是HttpClient4(JMeter默认的,对变量替换支持最好)。
4. 确认变量的作用域没问题
JSON提取器和删除请求必须在同一个Thread Group里,而且提取器所在的请求要在删除请求之前执行。要是提取器在另一个线程组,变量是跨线程组不共享的,得用User Defined Variables或者Property来传递才行。
5. 用硬编码ID测试一下
先把删除请求的URL改成http://dummy.restapiexample.com/api/v1/delete/82,运行看看能不能正常执行。如果可以,那百分百是变量提取或替换的问题,回到前面的步骤再仔细排查。
内容的提问来源于stack exchange,提问作者Poonam

