You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazemeter:如何在YAML脚本中实现异步API调用?

问题描述

我有两个API接口,分别为POST和GET请求。向POST请求发送JSON数据后,接口会返回一个id,我需要使用该id发起GET请求。由于测试的是大数据场景(如10k-15k行数据),必须等待id对应的任务生成完成才能执行GET请求。

当前使用的Blazemeter(Taurus)YAML脚本如下:

---
execution:
- concurrency: 30
  ramp-up: 1m
  hold-for: 10m
  scenario: 5K_Export Excel
scenarios:
  5K_Export Excel:
    store-cache: false
    store-cookie: false
    use-dns-cache-mgr: false
    variables:
      calcEngineId: ${calcEngineId}
      url: ${url}
    data-sources:
      # path of .csv files for ${calcEngineId}, ${url} and ${bearerToken}
    requests:
      - label: Post Pivot Data
        url: ${url}/${calcEngineId}/exportPivotDataToExcel
        follow-redirects: true
        method: POST
        headers:
          Content-Type: application/json
          User-Agent: ApacheJMeter
          Authorization: Bearer ${bearerToken1}
        content-encoding: UTF-8
        think-time: 30s
        timeout: 2m
        extract-jsonpath:
          jobId: $.id
        body:
          # body of POST request
      - label: Export To Excel
        url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId}
        follow-redirects: true
        method: GET
        headers:
          Content-Type: application/octet-stream
          User-Agent: ApacheJMeter
          Authorization: Bearer ${bearerToken1}
        content-encoding: UTF-8
        think-time: 1m
        timeout: 2m

我通过extract-jsonpath提取id并存储到jobId变量中,随后将jobId用于GET请求的URL。但在Blazemeter中运行时,GET请求返回Bad Request,推测是发起GET请求时jobId对应的任务尚未生成完成。尝试在POST和GET请求之间添加60秒固定等待,仅小数据量场景正常,大数据量场景问题依旧。

请问如何在YAML脚本中实现异步调用的等待逻辑?还有其他解决方法吗?

解决方案

固定等待时间无法适配大数据量下的任务处理波动,最优方案是主动轮询任务状态,直到任务完成后再执行GET请求。以下是两种可行的实现方式:

方式1:基于任务状态接口的轮询(推荐)

如果有查询任务状态的API,通过轮询该接口判断任务是否完成:

requests:
  - label: Post Pivot Data
    url: ${url}/${calcEngineId}/exportPivotDataToExcel
    follow-redirects: true
    method: POST
    headers:
      Content-Type: application/json
      User-Agent: ApacheJMeter
      Authorization: Bearer ${bearerToken1}
    content-encoding: UTF-8
    think-time: 30s
    timeout: 2m
    extract-jsonpath:
      jobId: $.id
    body:
      # body of POST request
  # 新增轮询任务状态的请求
  - label: Poll Job Status
    url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId}/status
    method: GET
    headers:
      Content-Type: application/json
      User-Agent: ApacheJMeter
      Authorization: Bearer ${bearerToken1}
    extract-jsonpath:
      jobStatus: $.status  # 假设接口返回的状态字段为status,值为completed表示完成
    repeat:
      while: ${jobStatus} != "completed"  # 状态未完成则继续轮询
      delay: 10s  # 每次轮询间隔10秒
      max-times: 30  # 最大轮询30次(共5分钟),避免无限循环
  - label: Export To Excel
    url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId}
    follow-redirects: true
    method: GET
    headers:
      Content-Type: application/octet-stream
      User-Agent: ApacheJMeter
      Authorization: Bearer ${bearerToken1}
    content-encoding: UTF-8
    timeout: 2m

方式2:直接重试GET请求(无状态接口时使用)

如果没有任务状态接口,直接重试GET请求直到返回成功响应:

requests:
  - label: Post Pivot Data
    # 原POST请求配置不变...
    extract-jsonpath:
      jobId: $.id
  - label: Export To Excel
    url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId}
    follow-redirects: true
    method: GET
    headers:
      Content-Type: application/octet-stream
      User-Agent: ApacheJMeter
      Authorization: Bearer ${bearerToken1}
    content-encoding: UTF-8
    timeout: 2m
    repeat:
      while: ${response-code} != 200  # 响应码不是200则重试
      delay: 10s
      max-times: 30

关键说明

  • 轮询间隔(delay)和最大次数(max-times)可根据实际任务处理时长调整,平衡等待效率和资源消耗。
  • Taurus的repeat结合while条件支持动态控制请求执行逻辑,完美适配异步任务的等待场景,比固定think-time更可靠。

内容的提问来源于stack exchange,提问作者Sravan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:35:14