如何借助JSON数组发起GET请求并批量执行(模仿Java sendPushStream)
批量从JSON数组发起HTTP请求的实现方案
嘿,我懂你现在的处境——已经能搞定单个请求的发送,但要把JSON数组里的每一项都批量发出去,不管是GET请求还是像Java里sendPushStream那样的POST推送对吧?下面我给你几个实用的实现方案,都是贴近实际开发的写法,你可以直接照着改:
通用逻辑步骤
不管用什么语言,核心流程都是这几步:
- 读取本地JSON文件,解析成可遍历的数组
- 遍历数组中的每一项
- 从项中提取请求所需的参数(比如URL、请求体数据)
- 发起对应的GET/POST请求
- 处理请求响应(成功时记录结果,失败时捕获错误甚至重试)
1. Node.js 实现(用axios库,和Java HTTP客户端逻辑对齐)
首先安装依赖:
npm install axios fs
然后写代码:
const fs = require('fs'); const axios = require('axios'); // 读取并解析本地JSON文件 const requestItems = JSON.parse(fs.readFileSync('./your-data-file.json', 'utf8')); // 批量请求处理函数 async function batchProcessRequests() { // 顺序遍历:适合有依赖的请求,避免服务器压力过大 for (const item of requestItems) { try { // --- 处理GET请求 --- // 假设每个item里有id字段,用来拼接请求URL const getResp = await axios.get(`https://your-api-domain.com/api/data/${item.id}`); console.log(`GET请求成功,返回结果:`, getResp.data); // --- 模拟Java的sendPushStream POST请求 --- // 假设item里有streamData字段是要推送的内容 const postResp = await axios.post('https://your-api-domain.com/api/push', { streamContent: item.streamData, source: 'batch-job' }); console.log(`POST推送成功,响应状态码:`, postResp.status); } catch (err) { console.error(`处理项${JSON.stringify(item)}失败:`, err.message); // 可选:失败重试逻辑,比如延迟1秒后重试当前项 // await new Promise(resolve => setTimeout(resolve, 1000)); // 这里可以重新发起请求 } } // 如果需要并发请求(效率更高,注意服务器限流),可以用Promise.all // const requestPromises = requestItems.map(item => { // return axios.get(`https://your-api-domain.com/api/data/${item.id}`); // }); // const responses = await Promise.all(requestPromises); // responses.forEach(resp => console.log(resp.data)); } // 执行批量任务 batchProcessRequests();
2. Python 实现(用requests库,简洁易读)
先安装依赖:
pip install requests
代码示例:
import json import requests # 读取JSON数据文件 with open('./your-data-file.json', 'r', encoding='utf-8') as f: request_items = json.load(f) def batch_send_requests(): for item in request_items: try: # --- GET请求示例 --- # 拼接URL或添加查询参数 get_url = f"https://your-api-domain.com/api/data/{item['id']}" get_resp = requests.get(get_url) get_resp.raise_for_status() # 主动抛出HTTP错误 print(f"GET请求成功,返回数据: {get_resp.json()}") # --- 模拟sendPushStream的POST请求 --- # 如果是发送二进制流,可以用files参数;普通JSON用json参数 post_url = "https://your-api-domain.com/api/push" post_payload = { "stream_data": item['stream_content'], "timestamp": item['timestamp'] } post_resp = requests.post(post_url, json=post_payload) post_resp.raise_for_status() print(f"POST推送成功,响应状态: {post_resp.status_code}") except Exception as e: print(f"处理项{item}失败: {str(e)}") # 可选重试逻辑 # import time # time.sleep(1) # 重新执行当前项的请求逻辑 # 执行批量任务 batch_send_requests()
如果需要并发执行,用ThreadPoolExecutor控制并发数:
from concurrent.futures import ThreadPoolExecutor def process_single_item(item): # 把单个请求的逻辑放到这里 try: # GET和POST请求代码... pass except Exception as e: print(f"处理失败: {str(e)}") # 控制最大并发数为5,避免打垮服务器 with ThreadPoolExecutor(max_workers=5) as executor: executor.map(process_single_item, request_items)
关键注意事项
- 顺序 vs 并发:如果请求之间有依赖(比如前一个请求的结果是后一个的参数),用顺序遍历;如果无依赖,用并发提高效率,但一定要控制并发数,避免触发服务器的限流机制。
- 错误处理:必须添加异常捕获,避免单个请求失败导致整个批量任务中断,还可以加上重试逻辑处理临时网络波动。
- 参数适配:根据你实际的JSON数组结构调整参数提取方式,比如有的item是
{"requestUrl": "...", "queryParams": {...}},有的是{"dataId": 123, "pushContent": "..."},灵活修改请求的URL和请求体。 - 流式POST适配:如果你的Java
sendPushStream是发送大文件或流式数据,Node.js里可以用axios的stream选项传递流对象;Python里可以用requests的data参数传文件对象或生成器。
内容的提问来源于stack exchange,提问作者john paul
相关产品推荐
相关产品推荐

