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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:27:14