如何循环读取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为空时出现无效文件名。
额外优化建议
- 错误日志:可以添加curl退出码检查,记录失败请求:
if ! curl ...; then echo "请求失败,行内容:$json_line" >> api_error.log fi - 并发控制:如果API允许,可在curl命令后加
&让请求后台运行,但需注意不要超出API的并发限制。
内容的提问来源于stack exchange,提问作者JohnJ
相关产品推荐
相关产品推荐

