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

JMeter中如何用JSR223(Groovy)实现WS Play API请求全动态化

基于WebSocket响应动态生成WS Play API请求(Groovy + JSR223 PostProcessor)

需求说明

需要通过JSR223 PostProcessor(Groovy语言),完全依赖WebSocket API的响应内容,实现WS Play API请求的全动态化,包括动态生成guidance_order等核心字段。


实现步骤

一、前置准备

  • 确保JMeter测试计划中已添加WebSocket Request Sampler用于获取WebSocket响应,并将JSR223 PostProcessor挂载到该Sampler下。
  • JMeter默认自带Groovy支持,无需额外配置依赖。

二、核心Groovy脚本实现

将以下代码粘贴到JSR223 PostProcessor的脚本编辑框中:

// 1. 获取并解析WebSocket响应内容
def wsResponse = prev.getResponseDataAsString()
def jsonSlurper = new groovy.json.JsonSlurper()
def responseData = jsonSlurper.parseText(wsResponse)

// 2. 映射session_type字段:audio→1,video→2,guidance→3
def sessionTypeMap = [
    "audio": 1,
    "video": 2,
    "guidance": 3
]
def sessionType = sessionTypeMap[responseData.session_type] ?: 3 // 缺失时默认取3

// 3. 动态生成guidance_order:提取music_guidance中的index值
def guidanceOrder = responseData.music_guidance.collect { it.index }

// 4. 提取并组装音乐相关字段
def infusedMusic = responseData.infused_music ?: []
def audioPlaylistUrls = infusedMusic.collect { it.distribution_url }
def artistNameList = infusedMusic.collect { it.artist_name }
def iscrs = infusedMusic.collect { it.ISRC }
def audioIds = infusedMusic.collect { it.id }
def songTitles = infusedMusic.collect { it.title }
def audioDurations = infusedMusic.collect { it.duration }

// 5. 提取并组装引导相关字段
def musicGuidance = responseData.music_guidance ?: []
def guidancePlaylistUrls = musicGuidance.collect { it.url }
def guidanceIds = musicGuidance.collect { it.id }
def guidanceTitles = musicGuidance.collect { it.title }
def guidanceDurations = musicGuidance.collect { it.duration }

// 6. 映射其他基础字段
def sessionStartMood = responseData.starting_emotion?.replace("_v1", "") ?: "calm"
def sessionEndMood = responseData.ending_emotion?.replace("_v1", "") ?: "calm"
def genre = responseData.genre ?: ""
def subGenre = responseData.sub_genre ?: responseData.subgenre ?: ""
def confidenceScore = responseData.music_recommendation ?: 0.0
def guidanceCategory = responseData.guidance ?: ""
def playlistId = responseData.playlist_id ?: ""
def playlistThumbnailImage = responseData.thumbnail_image ?: ""
def playlistRecommender = responseData.playlist_recommender ?: ""

// 7. 组装完整请求JSON
def playApiRequest = [
    guidance_order: guidanceOrder,
    session_type: sessionType,
    session_start_mood: sessionStartMood,
    session_end_mood: sessionEndMood,
    genre: genre,
    sub_genre: subGenre,
    playlist_recommender: playlistRecommender,
    confidence_score: confidenceScore,
    video_category: "",
    guidance_category: guidanceCategory,
    audio_playlist_urls: audioPlaylistUrls,
    video_playlist_urls: [],
    guidance_playlist_urls: guidancePlaylistUrls,
    artist_name_list: artistNameList,
    track_id_list: [
        iscrs: iscrs,
        video_ids: [],
        guidance_ids: guidanceIds,
        audio_ids: audioIds
    ],
    track_name_list: [
        song_titles: songTitles,
        video_titles: [],
        guidance_titles: guidanceTitles
    ],
    video_metadata: [
        videos_duration: [],
        videos_length: [],
        videos_start_time: []
    ],
    track_durations: [
        audio_durations: audioDurations,
        video_durations: [],
        guidance_durations: guidanceDurations
    ],
    playlist_id: playlistId,
    playlist_thumbnail_image: playlistThumbnailImage
]

// 8. 将请求JSON保存为JMeter变量,供后续请求使用
def jsonBuilder = new groovy.json.JsonBuilder(playApiRequest)
vars.put("wsPlayApiRequest", jsonBuilder.toPrettyString())

// 可选:打印生成的请求到日志用于调试
// log.info("Generated WS Play API Request: " + jsonBuilder.toPrettyString())

三、后续使用

在WS Play API的请求Sampler中,直接引用变量${wsPlayApiRequest}作为请求体即可。

四、关键注意事项

  • 空值处理:脚本中通过?:设置默认值,避免因响应字段缺失导致脚本报错。
  • 字段映射一致性:根据业务规则调整字段转换逻辑(比如starting_emotion去掉_v1后缀)。
  • 调试:开启脚本末尾的日志打印,可在JMeter日志中验证生成的请求是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.06 03:14:50