如何使用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
相关产品推荐
相关产品推荐

