Python - aiohttp API 响应内容是 "StreamReader" 类型而不是 JSON
Python - aiohttp API response content is "StreamReader" type instead of JSON
我正在使用 Python 3.10 学习 aiohttp
库以发出 HTTP GET 请求,并使用 GitHub v3 REST API 进行练习。这是我的基本请求代码:
# Python Standard Library imports
import asyncio
import sys
# External library imports
import aiohttp
# GitHub API v3 REST endpoint for licenses
GITHUB_URL: str = "https://api.github.com/licenses"
# GitHub query headers
GITHUB_HEADERS: dict = {
"Accept": "application/vnd.github.v3+json"
}
async def main():
async with aiohttp.ClientSession() as session:
async with session.get(GITHUB_URL, headers = GITHUB_HEADERS) as GitHub_response:
print(GitHub_response.content)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
sys.exit(0)
代码运行没有错误,但关键的 print(GitHub_response.content
行给我:
<StreamReader 2037 bytes eof>
这不是我所期望的。什么是 StreamReader
对象???
我期望的是 JSON 输出,curl
命令 curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/licenses
会给我,看起来像:
[
{
"key": "agpl-3.0",
"name": "GNU Affero General Public License v3.0",
"spdx_id": "AGPL-3.0",
"url": "https://api.github.com/licenses/agpl-3.0",
"node_id": "MDc6TGljZW5zZTE="
},
{
"key": "bsd-2-clause",
"name": "BSD 2-Clause \"Simplified\" License",
"spdx_id": "BSD-2-Clause",
"url": "https://api.github.com/licenses/bsd-2-clause",
"node_id": "MDc6TGljZW5zZTQ="
},
.....
我尝试用 print(GitHub_response.json())
替换我的 print()
行,但这给了我:
<coroutine object ClientResponse.json at 0x7f7e452b5e00>
所以它仍然不是我期待的JSON。
我做错了什么?以及如何修复我的 Python 代码,以便我得到实际的 JSON 响应 with aiohttp
?
谢谢。
P.S. 我尝试使用 Python requests
库执行上述操作。在这种情况下,响应的内容是一个 bytes
对象,在使用 json
库中的 json.dumps()
将其转换为实际的 [=63= 之前,我必须先 decode("utf8")
].不确定此信息是否有助于弄清楚我在使用 aiohttp
.
时搞砸了什么
"content" 是 StreamReader. This provides a coroutine "read" 的一个实例,它读取 returns 内容作为字符串。将以下示例插入您的代码中,您应该会得到预期的结果。
x = await GitHub_response.content.read()
print(x.decode("utf8"))
我正在使用 Python 3.10 学习 aiohttp
库以发出 HTTP GET 请求,并使用 GitHub v3 REST API 进行练习。这是我的基本请求代码:
# Python Standard Library imports
import asyncio
import sys
# External library imports
import aiohttp
# GitHub API v3 REST endpoint for licenses
GITHUB_URL: str = "https://api.github.com/licenses"
# GitHub query headers
GITHUB_HEADERS: dict = {
"Accept": "application/vnd.github.v3+json"
}
async def main():
async with aiohttp.ClientSession() as session:
async with session.get(GITHUB_URL, headers = GITHUB_HEADERS) as GitHub_response:
print(GitHub_response.content)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
sys.exit(0)
代码运行没有错误,但关键的 print(GitHub_response.content
行给我:
<StreamReader 2037 bytes eof>
这不是我所期望的。什么是 StreamReader
对象???
我期望的是 JSON 输出,curl
命令 curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/licenses
会给我,看起来像:
[
{
"key": "agpl-3.0",
"name": "GNU Affero General Public License v3.0",
"spdx_id": "AGPL-3.0",
"url": "https://api.github.com/licenses/agpl-3.0",
"node_id": "MDc6TGljZW5zZTE="
},
{
"key": "bsd-2-clause",
"name": "BSD 2-Clause \"Simplified\" License",
"spdx_id": "BSD-2-Clause",
"url": "https://api.github.com/licenses/bsd-2-clause",
"node_id": "MDc6TGljZW5zZTQ="
},
.....
我尝试用 print(GitHub_response.json())
替换我的 print()
行,但这给了我:
<coroutine object ClientResponse.json at 0x7f7e452b5e00>
所以它仍然不是我期待的JSON。
我做错了什么?以及如何修复我的 Python 代码,以便我得到实际的 JSON 响应 with aiohttp
?
谢谢。
P.S. 我尝试使用 Python requests
库执行上述操作。在这种情况下,响应的内容是一个 bytes
对象,在使用 json
库中的 json.dumps()
将其转换为实际的 [=63= 之前,我必须先 decode("utf8")
].不确定此信息是否有助于弄清楚我在使用 aiohttp
.
"content" 是 StreamReader. This provides a coroutine "read" 的一个实例,它读取 returns 内容作为字符串。将以下示例插入您的代码中,您应该会得到预期的结果。
x = await GitHub_response.content.read()
print(x.decode("utf8"))