使用aiohttp异步请求API时,response.json()返回协程对象问题排查
问题分析与解决方案
核心问题是你没有对response.json()进行await调用——ClientResponse.json()是一个异步协程方法,必须通过await才能获取实际的JSON数据,直接调用只会返回协程对象。
错误代码示例(问题所在)
假设你的请求逻辑类似这样(错误写法):
async def fetch_data(session, date): url = f"your_api_url?date={date}" async with session.get(url) as response: if response.status == 200: # 错误:直接返回协程对象,没有await return response.json()
修正后的代码
只需要在response.json()前加上await:
async def fetch_data(session, date): url = f"your_api_url?date={date}" async with session.get(url) as response: if response.status == 200: # 正确:await异步方法获取JSON结果 return await response.json() else: # 可选:处理非200状态的情况 return None
结合你的函数结构的完整修正示例
import asyncio import aiohttp async def fetch_single_date(session, date): # 单个日期的API请求逻辑 api_url = f"https://your-api-endpoint.com/data?date={date}" async with session.get(api_url) as response: if response.status == 200: # 关键:await response.json() return await response.json() else: print(f"请求日期{date}失败,状态码:{response.status}") return None async def executeCallAllDates(dates_list): # 创建aiohttp会话,复用连接提升效率 async with aiohttp.ClientSession() as session: # 创建所有异步任务 tasks = [fetch_single_date(session, date) for date in dates_list] # 并发执行并获取所有结果 results = await asyncio.gather(*tasks) return results def executeCallAsync(dates_list): # 在Databricks中运行异步事件循环 results = asyncio.run(executeCallAllDates(dates_list)) # 后续处理结果并存入数据湖的逻辑 for date, data in zip(dates_list, results): if data: # 写入数据湖的代码,比如用spark.write等 pass
额外注意事项
- 不要混用同步和异步代码:确保所有调用异步方法的地方都在异步函数内并使用
await - Databricks环境中,若遇到事件循环相关问题,可以尝试获取现有循环而非创建新循环:
loop = asyncio.get_event_loop() results = loop.run_until_complete(executeCallAllDates(dates_list))
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

