Python aiohttp与requests请求同接口返回结果差异问题求解
问题根因
不存在接口对aiohttp、requests返回不同内容的情况,从你贴的aiohttp输出可以看到,请求实际已经拿到200 OK的正常响应,响应头也明确标注返回格式为application/json,问题出在aiohttp代码的写法错误:
- 核心错误:
aiohttp.ClientResponse的text是需要调用的异步协程方法,不是requests里那种可直接读取的实例属性。你写的result = get_image_data.text没有加括号调用方法,也没有加await等待协程执行,拿到的只是方法本身的对象引用,就是输出里看到的<bound method ClientResponse.text ...>,根本没有实际读取响应体内容。 - 次要问题:你写的requests版本headers里,
User-Agent的键名和值前面都多了前置空格,属于格式不合法的请求头,只是requests自带容错机制自动处理了这个问题,aiohttp对header格式校验更严格,多余空格会导致请求头不生效,不过你当前aiohttp版本里的UA头格式是正确的。
修正后的可运行aiohttp代码
import aiohttp import asyncio headersList = { "Accept": "*/*", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36" } async def test(): async with aiohttp.ClientSession() as session: async with session.get( 'https://api-mainnet.magiceden.io/all_collections_with_escrow_data', headers=headersList ) as resp: # 注意:text是方法要加括号,且是协程必须加await result = await resp.text() print(result) if __name__ == '__main__': asyncio.run(test())
注意事项
- 你在aiohttp版本里额外加的
origin、referer、sec-fetch-*这类请求头,这个接口完全不做校验,不需要额外添加,和requests一样传基础头就能正常拿到数据。 - aiohttp中所有读取响应内容的方法:
text()、json()、read()全都是异步协程,必须加await关键字调用,不能直接当属性取值。 - 响应读取操作要放在
async with session.get(...) as resp的上下文块内部执行,避免连接释放后再读内容抛出连接关闭错误。
内容的提问来源于stack exchange,提问作者Zambo
相关产品推荐
相关产品推荐

