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

如何循环读取JSON文件调用Curl请求API,保存独立输出并兼容UTF-8

逐行读取JSON文件并批量调用API保存结果

可以用Bash循环逐行读取input.dat,结合curl完成批量请求,同时保证UTF-8编码正确处理。以下是两种可行的实现方式:

方案1:按行号命名输出文件

这种方式简单直接,每个请求的输出会保存为output_1.dat、output_2.dat这类有序文件:

#!/bin/bash
# 强制环境使用UTF-8编码,避免字符转换错误
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

line_num=1
while IFS= read -r json_line; do
  # 跳过空行,避免无效请求
  [[ -z "$json_line" ]] && continue
  
  curl --header "Content-Type: application/json" \
       -H 'Authorization: Token 878768' \
       --request POST \
       --data "$json_line" \
       "http://<ip_add>:80/endpoint/api/" \
       -o "output_${line_num}.dat"
  
  line_num=$((line_num + 1))
done < input.dat

关键细节:

  • IFS= read -r json_line:IFS=保留行首/行尾的空格,-r不转义JSON中的反斜杠等特殊字符,确保原始JSON格式完全传递给API。
  • 环境变量设置:强制UTF-8 locale,保证curl正确处理文件中的UTF-8字符。

方案2:用JSON中的var1字段命名输出文件

如果希望输出文件名更有业务意义,可以提取每行JSON的var1值作为文件名(需要安装jq工具解析JSON):

#!/bin/bash
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

while IFS= read -r json_line; do
  [[ -z "$json_line" ]] && continue
  
  # 提取var1的值,替换文件名中的非法字符
  filename=$(echo "$json_line" | jq -r '.var1' | sed 's/[\/:*?"<>|]/-/g')
  # 兜底处理空值情况,避免文件名无效
  [[ -z "$filename" ]] && filename="unknown_$RANDOM"
  
  curl --header "Content-Type: application/json" \
       -H 'Authorization: Token 878768' \
       --request POST \
       --data "$json_line" \
       "http://<ip_add>:80/endpoint/api/" \
       -o "${filename}.dat"
done < input.dat

关键细节:

  • jq -r '.var1':精准提取JSON中var1的原始字符串值。
  • sed替换:将文件名中不允许的特殊字符(如/、:等)替换为-,避免创建文件失败。
  • 随机兜底名:防止var1为空时出现无效文件名。

额外优化建议

  1. 错误日志:可以添加curl退出码检查,记录失败请求:
    if ! curl ...; then
      echo "请求失败,行内容:$json_line" >> api_error.log
    fi
    
  2. 并发控制:如果API允许,可在curl命令后加&让请求后台运行,但需注意不要超出API的并发限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:57:38