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

如何使用Gatling Scala从CSV Feeder生成指定POST请求Payload

问题描述

需要为POST请求生成指定格式的Payload,要求将订单号追加到指定URL末尾并添加至selections列表中。请指导如何基于提供的CSV文件中的每条员工记录生成该Payload?是否可以遍历CSV文件中的订单号列表来生成该Payload?

附:相关文件与结构

CSV文件内容(data.csv)

empNo, orderNo
e12345,[49,50,51,52,53,54,55,56,41,42,43,44,45,46,47,48,57]
e23456,[52,51,53,50,37,36,38]
e37765,[96,95,94,88,87,50,49,42,62,54,14-16,51,53,52,55,41,63]
e47899,[96,95,94,93,92,91,90,89,49,50,51,52,53,54,55,56,47,46,48,45,44,43,42,41]
e59090,[95,96,94,93,50,87,86,88,14-16]
e69000,[96,95,94,88,87,26,25,43,44,50,10]
e72453,[96,95,94,93,49,50,51,63,62,61,56,55,54,53,52,64,65,92,91,90,88,87,86,89]

Payload中的URL示例

http://localhost:8080/order/00000-00000-00000/base-order/0da65bd8-a25f-4b2c-b2f6-2a7f5b0f6432/order-no/49

POST请求URL模板

http://localhost:8080/order/00000-00000-00000/base-order/order?employeeId=12345

所需Payload结构

{
  "submittedAt": "2023-02-08T20:27:33.144109-06:00",
  "allowSameMonth": false,
  "allowConsecutiveMonths": true,
  "selections": [
    "http://localhost:8080/order/00000-00000-00000/base-order/0da65bd8-a25f-4b2c-b2f6-2a7f5b0f6432/order-no/49",
    "http://localhost:8080/order/00000-00000-00000/base-order/0da65bd8-a25f-4b2c-b2f6-2a7f5b0f6432/order-no/50"
    // 其他订单号对应的URL
  ]
}

解决方案

核心结论

完全可以遍历CSV中的订单号列表生成目标Payload,以下是基于Python的具体实现步骤,可直接复用或修改适配需求。

实现步骤

1. 定义固定模板与工具函数

先定义请求URL模板和订单号解析函数,处理CSV中订单号的特殊格式(如14-16这类范围值):

import csv
import json

# 订单URL模板,{}用于填充订单号
ORDER_URL_TEMPLATE = "http://localhost:8080/order/00000-00000-00000/base-order/0da65bd8-a25f-4b2c-b2f6-2a7f5b0f6432/order-no/{}"
# POST请求URL模板,{}用于填充员工ID
POST_URL_TEMPLATE = "http://localhost:8080/order/00000-00000-00000/base-order/order?employeeId={}"

def parse_order_numbers(order_str):
    """解析CSV中的orderNo字段,处理单个数字和范围格式"""
    # 去除方括号并分割成单个项
    items = order_str.strip('[]').split(',')
    order_ids = []
    for item in items:
        item = item.strip()
        # 处理范围值,比如14-16展开为14、15、16
        if '-' in item:
            start, end = map(int, item.split('-'))
            order_ids.extend(range(start, end + 1))
        else:
            order_ids.append(int(item))
    return order_ids

2. 遍历CSV生成Payload与请求URL

读取CSV的每一行记录,解析订单号并生成完整的Payload:

with open('data.csv', 'r', encoding='utf-8') as csv_file:
    # 按字典格式读取CSV
    reader = csv.DictReader(csv_file)
    for row in reader:
        emp_no = row['empNo'].strip()
        order_str = row['orderNo'].strip()
        
        # 解析当前员工的所有订单号(含范围展开)
        order_ids = parse_order_numbers(order_str)
        
        # 生成selections列表
        selections = [ORDER_URL_TEMPLATE.format(oid) for oid in order_ids]
        
        # 构建完整Payload
        payload = {
            "submittedAt": "2023-02-08T20:27:33.144109-06:00",
            "allowSameMonth": False,
            "allowConsecutiveMonths": True,
            "selections": selections
        }
        
        # 生成POST请求URL(去掉empNo的前缀'e',匹配示例格式)
        post_url = POST_URL_TEMPLATE.format(emp_no.lstrip('e'))
        
        # 输出结果(可根据需求保存为文件、直接发起请求等)
        print(f"=== 员工 {emp_no} 的请求信息 ===")
        print(f"POST URL: {post_url}")
        print(f"Payload:\n{json.dumps(payload, indent=2, ensure_ascii=False)}")
        print("-" * 60)

3. 关键说明

  • 自动处理CSV中orderNo的两种格式:单个数字和范围值(如14-16会自动展开为三个订单号)
  • 自动替换POST请求URL中的employeeId为CSV中的员工号(去掉前缀e,匹配示例格式)
  • 生成的Payload完全符合要求,selections列表自动填充所有转换后的URL
  • 如果需要直接发起POST请求,可以在代码中加入requests库调用,比如:
    import requests
    response = requests.post(post_url, json=payload)
    print(f"请求响应状态码: {response.status_code}")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55