如何用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
相关产品推荐
相关产品推荐

