为啥返回空字节作为响应?

Posted

技术标签:

【中文标题】为啥返回空字节作为响应?【英文标题】:Why are empty bytes returned as a response?为什么返回空字节作为响应? 【发布时间】:2021-10-07 02:07:04 【问题描述】:

我正在学习 python 异步。我的问题是我试图以流内容的形式获得答案,但由于我没有尝试,总是会出现空字节。是什么原因?我究竟做错了什么? 我选择了 Github API 作为示例。

我使用的版本是python 3.8,aiohttp 3.7.4。

这是我的代码: 导入json 导入 aiohttp 导入异步 异步定义 get_response(): url = 'https://api.github.com/events' 与 aiohttp.ClientSession() 异步作为会话: task1 = asyncio.create_task(make_request(session, url)) 结果 = 等待 asyncio.gather(task1) 返回结果

async def make_request(session, url):
    async with session.get(url) as resp:
        json_resp = await resp.json(loads=json.loads)
        bytes_resp = await resp.content.read(10)
        print(json_resp)
        print(bytes_resp)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(get_response())

非常感谢。

得到这个 enter image description here

【问题讨论】:

我不得不更正代码中的一些缩进,但我设法得到了来自 b'["id":"17' 的 'api.github.com/events' 的响应,目前使用的是 aiohttp 3.7.4和 python 3.8. 你只得到 b'' 的响应吗? 是的。但是如果我从我的代码中删除 json_resp,那么一切正常 需要在顶部添加import json吗?我刚刚运行它,json_resp 打印出来自 url 的整个响应。 我不小心忘记将这个添加到问题中使用的代码中。我现在修复它 【参考方案1】:

您不能同时将响应读取为 JSON 并再次读取为字节,因为此时它已被使用。 (aiohttp 故意不在内部缓冲响应数据。)

如果两者都需要,

bytes_resp = await resp.content.read()
json_resp = json.loads(bytes_resp)

【讨论】:

非常感谢。一切都对我有用。我能否以某种方式充分利用 StreamReader 的可能性? 完全取决于你想做什么。那个事件 JSON 端点不是实时流,如果这就是你想要的...... 我希望能够对收到的响应进行异步迭代。 那么你只需要一个循环来从响应流中进行较小的读取:)

以上是关于为啥返回空字节作为响应?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Symfony Mailer 组件返回一个空响应?

RestKit 从 JSON 响应返回空值作为“<null>”

为啥这个 API 在 AFNetworking 中将其响应作为“失败”返回,而它正是它应该是的并且状态码是 200?

Spyne:为啥我收到 json 请求的空响应?

为啥我从这个请求 iOS JSON 得到空响应

Paypal IPN 协议:为啥示例中没有发送空的 HTTP 200 响应?