如何在Bash中批量处理带参数上限的Curl API请求?
按单请求参数上限拆分批量请求的实现方案
核心逻辑是对参数数组做定长分块,每块长度不超过接口限制的20个参数,用最少的请求数完成所有参数查询,同时配合合理请求间隔避免触发访问封禁。
具体实现逻辑
- 从JSON文件中读取完整的参数数组,做基础格式校验,过滤无效空值
- 按每20个参数为一组做切片:满20个参数即划分为独立请求组,最后剩余不足20个的参数单独成组,总请求数为理论最小值。例如115个参数会自动拆分为5组20个参数、1组15个参数,完全符合要求
- 每个分组单独序列化为接口要求的JSON数组格式,拼接为合法curl命令
- 请求间增加1-2秒的随机/固定间隔,进一步降低触发接口限流封禁的概率
可直接运行的Shell实现
依赖jq工具做JSON的解析与序列化,避免手动拼接JSON出现转义错误,兼容带特殊字符的参数场景:
#!/bin/bash # 基础配置 API_PATH="/api/endpoint" PARAM_FILE="./params.json" # 存储参数的JSON文件,内容为标准JSON数组格式 BATCH_SIZE=20 # 单请求最大参数数,对应接口限制 SLEEP_SEC=1 # 请求间隔,可根据接口限流规则调整 # 读取所有参数存入数组 all_params=($(jq -r '.[]' "$PARAM_FILE")) total_count=${#all_params[@]} echo "已加载参数总数:$total_count" # 计算需要的总请求数 request_count=$(( (total_count + BATCH_SIZE - 1) / BATCH_SIZE )) echo "将拆分为 $request_count 个请求发起调用" # 循环生成分块请求 for ((req_idx=0; req_idx<request_count; req_idx++)); do offset=$((req_idx * BATCH_SIZE)) # 截取当前批次的参数 batch_params=("${all_params[@]:$offset:$BATCH_SIZE}") # 序列化为符合接口要求的JSON数组字符串 batch_json=$(printf '%s\n' "${batch_params[@]}" | jq -R . | jq -s -c .) echo "发起第$((req_idx+1))个请求,携带参数${#batch_params[@]}个" # 执行curl请求 curl -s -g GET "${API_PATH}?parameters=${batch_json}" # 非最后一个请求时等待间隔时间 if [ $req_idx -lt $((request_count - 1)) ]; then sleep $SLEEP_SEC fi done
注意:如果你的运行环境没有
jq,可以通过系统包管理器直接安装(Debian/Ubuntu执行apt install jq,CentOS/RHEL执行yum install jq即可),相比手动拼接JSON字符串,用jq处理能完全避免引号转义、特殊字符解析错误的问题。
内容的提问来源于stack exchange,提问作者divedivedive
相关产品推荐
相关产品推荐

