如何用Shell循环读取JSON文件调用API?Shell与Python哪个更适配?
批量API调用方案咨询
背景信息
现有包含700条用户数据的JSON文件,结构如下:
[ { "firstName": "John", "lastName": "Doe", "dob": "1900-01-01", "zipCode": "12345", "subscriberId": "123456789", "policyNumber": "12345" }, { "firstName": "Jane", "lastName": "Doe", "dob": "1900-01-01", "zipCode": "54321", "subscriberId": "987654321", "policyNumber": "54321" } ]
同时有单次调用目标API的Shell脚本:
#!/bin/bash # Rally Forwarder Keys clientkey=test apikey=test #SET apikey=test # Public URL url="test" curl -v -X POST -d '{"firstName":"test","lastName":"test","dob":"1900-01-01","zipCode":"12345","subscriberId":"123456789","policyNumber":"12345"}' -H "Content-type:application/json" "${url}" -H "X-OnePass-API-Key: ${apikey}" -H "X-OnePass-ClientKey: ${clientkey}"
原本用VBA Selenium提交网页表单,但无法适配目标API,本人Shell脚本能力基础,现咨询:
- 是否可以通过Shell循环读取JSON文件来调用API?
- Shell与Python哪个更适合完成该批量调用任务?
问题解答
1. 可以通过Shell循环读取JSON文件调用API
完全可行,核心依赖jq工具解析JSON数组,逐个提取用户数据作为curl请求体。示例脚本如下:
#!/bin/bash clientkey=test apikey=test url="test" # 用jq将JSON数组拆分为单行用户数据,循环发送请求 jq -c '.[]' users.json | while read -r user_data; do curl -X POST \ -H "Content-type:application/json" \ -H "X-OnePass-API-Key: ${apikey}" \ -H "X-OnePass-ClientKey: ${clientkey}" \ -d "${user_data}" \ "${url}" # 可选:添加延时避免请求过于频繁触发限流 sleep 1 done
说明:
- 需要先安装
jq工具(Linux发行版可通过apt install jq或yum install jq安装) jq -c '.[]' users.json会把数组内的每个对象转为紧凑单行格式,方便循环读取- 移除了
-v参数减少冗余日志,调试时可重新添加
2. Python更适合完成该批量任务
对比Shell方案,Python有以下核心优势:
- 错误处理更灵活:可轻松捕获API请求失败(如非200状态码),实现重试逻辑,或记录失败数据后续处理
- 代码可读性与维护性更高:复杂逻辑(如并发请求、数据校验)的代码结构更清晰,后续修改成本低
- 无需额外依赖外部工具:内置
json库解析数据,requests库发送HTTP请求比curl更简洁 - 扩展性强:后续如需添加数据预处理、结果统计、批量并发等功能,Python能快速实现
Python示例代码:
import json import requests import time clientkey = "test" apikey = "test" url = "test" # 读取JSON文件 with open("users.json", "r") as f: users = json.load(f) headers = { "Content-type": "application/json", "X-OnePass-API-Key": apikey, "X-OnePass-ClientKey": clientkey } for user in users: try: response = requests.post(url, json=user, headers=headers) response.raise_for_status() # 触发HTTP错误异常 print(f"成功提交用户:{user['firstName']} {user['lastName']}") except Exception as e: print(f"提交用户失败 {user['firstName']} {user['lastName']}: {str(e)}") # 可选:将失败数据写入文件以便后续处理 with open("failed_users.json", "a") as f: json.dump(user, f) f.write("\n") time.sleep(1)
即使你Shell基础薄弱,Python这段代码逻辑直白,学习和调试成本很低,更适合处理这类批量数据交互任务。
内容的提问来源于stack exchange,提问作者Firefaded
相关产品推荐
相关产品推荐

