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

如何用Python Requests单次请求捕获API先等待后成功的响应?

解决方法

首先得明确这个API的响应机制:浏览器里看到的状态变化,要么是一次请求的流式响应(服务器hold住连接,等处理完再返回最终结果),要么是前端自动发起了多次请求(短连接轮询)。针对不同情况有不同优化方式:

1. 若API支持HTTP长轮询(一次请求拿最终结果)

这种情况下,浏览器的单次请求其实一直在等待服务器返回完整结果,中间的Code:4可能是分块返回的临时响应。你可以用Python的流式请求来处理,不用两次调用:

import requests
import json

api_url = "你的目标API地址"

# 开启流式请求,不让requests直接解析完整响应
with requests.get(api_url, stream=True) as resp:
    # 逐行读取响应内容
    for line in resp.iter_lines(decode_unicode=True):
        if not line:
            continue
        # 解析每行的JSON数据
        try:
            resp_data = json.loads(line)
            print(f"当前响应: {resp_data}")
            # 检测是否为成功响应
            if resp_data["Status"]["Code"] == 0:
                trans_id = resp_data["Status"]["TransactionId"]
                print(f"获取到成功响应,TransactionId: {trans_id}")
                break
        except json.JSONDecodeError:
            # 忽略非JSON格式的响应行
            pass

2. 若API是短连接+前端自动轮询

如果浏览器的网络面板里能看到两次独立的请求(第一次返回Code:4,第二次返回Code:0),说明是前端做了自动重试。这种情况没法用单次请求搞定,但可以把固定sleep的两次调用改成按需轮询,比固定等待更高效:

import requests
import json
import time

api_url = "你的目标API地址"
max_wait_times = 10  # 最多等待10次
wait_interval = 1    # 每次间隔1秒

for _ in range(max_wait_times):
    resp = requests.get(api_url)
    resp_data = resp.json()
    if resp_data["Status"]["Code"] == 0:
        print(f"成功响应: {resp_data}")
        break
    elif resp_data["Status"]["Code"] == 4:
        print("请求处理中,等待重试...")
        time.sleep(wait_interval)
else:
    print("超时,未获取到成功响应")

简单总结:如果是长轮询机制,一次请求就能拿到最终结果;如果是前端轮询逻辑,还是需要多次请求,但可以改成动态检测,不用固定sleep等待。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:42:08