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

如何在Gatling脚本中捕获HTTP响应(含响应码、Cookie等信息)?

在Gatling中捕获HTTP请求与对应响应的全指南

嘿,我来帮你搞定Gatling里同时捕获请求和响应的需求!不管是响应码、Cookie、响应体还是请求本身的内容,都有现成的方法和技巧可以实现,下面一步步给你讲清楚:

一、基础响应信息捕获(响应码、Cookie、响应消息)

Gatling自带的check方法是最直接的方式,能轻松把响应里的关键信息存入Session,后续可以复用或者输出:

  • 捕获响应码:用status检查器,还能顺便验证是否符合预期,比如:
    .check(status.is(200).saveAs("responseCode"))
    
  • 捕获Cookie:用cookie方法指定目标Cookie名称,直接存到Session:
    .check(cookie("JSESSIONID").saveAs("sessionCookie"))
    
  • 捕获响应消息/状态文本:Gatling 3.x+支持直接用statusText提取,或者通过响应头间接获取:
    .check(statusText.saveAs("responseMessage"))
    

二、捕获响应体

如果需要完整响应体或部分内容,根据响应类型选择合适的检查器:

  • 完整响应体:用bodyString直接捕获整个响应文本,存到Session:

    .check(bodyString.saveAs("responseBody"))
    

    注意:如果响应体很大(比如几MB以上),存到Session会占用大量内存,压测时谨慎使用,建议只在调试阶段启用。

  • JSON/XML响应的精准提取:用jsonPath或xpath定位特定字段,避免捕获整个大响应:

    .check(jsonPath("$.data.user.id").saveAs("userId"))
    

三、获取请求内容

Gatling默认不会自动存储请求细节,但有两种实用方式可以拿到:

1. 发送前手动存入Session

在发送请求前,把你构造的请求URL、参数、Body等提前存入Session,后续就能和响应一一对应:

exec(session => {
  val requestUrl = "https://your-api.com/user"
  val requestBody = """{"name":"test_user"}"""
  session
    .set("requestUrl", requestUrl)
    .set("requestBody", requestBody)
})
.http("POST Create User")
.post("${requestUrl}")
.body(StringBody("${requestBody}")).asJson
// 后续捕获响应...

2. 通过日志输出完整请求响应

如果只是调试时需要查看请求响应的完整细节,可以修改Gatling的logback.xml配置,开启HTTP日志的DEBUG级别:

<logger name="io.gatling.http" level="DEBUG" />
<logger name="io.gatling.http.response" level="DEBUG" />

这样运行脚本时,控制台或日志文件会打印出每个请求的URL、Headers、Body,以及对应的响应码、Headers、Body。

记得:压测时一定要把日志级别改回INFO或WARN,不然海量日志会严重拖垮压测性能。

四、完整示例脚本

这里给一个包含请求存储、响应捕获的完整示例,能同时拿到请求和对应的响应信息:

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class CaptureRequestResponse extends Simulation {

  val httpProtocol = http
    .baseUrl("https://jsonplaceholder.typicode.com")
    .acceptHeader("application/json")

  val scn = scenario("Capture Request & Response")
    // 提前存储请求内容到Session
    .exec(session => {
      val reqBody = """{"title":"foo","body":"bar","userId":1}"""
      session.set("requestBody", reqBody)
    })
    .http("POST Create Post")
    .post("/posts")
    .body(StringBody("${requestBody}")).asJson
    // 捕获响应关键信息
    .check(
      status.saveAs("responseCode"),
      statusText.saveAs("responseMessage"),
      cookie("__cf_bm").saveAs("cfCookie"), // 根据实际Cookie名称调整
      bodyString.saveAs("responseBody")
    )
    // 打印请求响应(仅调试用,压测时请删除)
    .exec(session => {
      println(s"===== Request Info =====")
      println(s"Request Body: ${session("requestBody").as[String]}")
      println(s"===== Response Info =====")
      println(s"Response Code: ${session("responseCode").as[String]}")
      println(s"Response Message: ${session("responseMessage").as[String]}")
      println(s"Captured Cookie: ${session("cfCookie").as[String]}")
      println(s"Response Body: ${session("responseBody").as[String]}")
      session
    })

  setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}

小提示

  • 如果需要在压测过程中持续记录请求响应,建议不要直接打印到控制台,而是用Gatling的feed组件或者自定义日志工具写入文件,避免性能损耗。
  • 对于二进制响应(比如图片、文件),可以用bodyBytes.saveAs("responseBytes")捕获字节数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:05:16