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

aiohttp.ClientSession异步请求无报错卡住的原因及解决方法

问题原因及修复方案

核心原因

  1. json参数使用错误:你手动用json.dumps()把字典转成了JSON字符串,但aiohttp.ClientSession.post()的json参数原生支持Python字典对象,aiohttp会自动完成JSON序列化并设置正确的请求头。传字符串会导致aiohttp将其作为普通文本发送,加上你手动设置的Content-Type: application/json,服务器无法正确解析请求体,进而导致请求一直处于等待状态,程序卡住。
  2. 冗余请求头设置:当使用json参数时,aiohttp会自动添加Content-Type: application/json请求头,手动设置的该头属于冗余操作,甚至可能引发编码相关的额外问题。

修正后的代码

import aiohttp
from aiohttp import ClientTimeout

# 假设self.cfg已正确定义
url = self.cfg['baseUrl']
async with aiohttp.ClientSession(timeout=ClientTimeout(300)) as session:
    data = {"data": ["a", "b", "c"]}  # 直接传入Python字典
    try:
        print("before request")
        async with session.post(url=url, json=data) as response:
            print("after request")
            # 先校验响应状态码,避免非JSON响应引发解析错误
            if response.status == 200:
                result = await response.json()
                print(result)
            else:
                print(f"请求失败,状态码: {response.status}")
                print(await response.text())
    except Exception as ex:
        print(f"请求异常: {ex}")

额外注意事项

  • 确保异步代码在事件循环中运行:如果这段代码是在普通函数中调用,需要用asyncio.run()启动事件循环,示例如下:
    import asyncio
    
    async def main():
        # 上述异步请求代码放在此处执行
    
    if __name__ == "__main__":
        asyncio.run(main())
    
  • 合理调整超时时间:300秒的超时过长,建议根据业务场景缩短(比如设置为10秒),能更快定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:11:01