我最近从请求换到了aiohttp,因为我无法在asyncio循环中使用它。
交换完美,一切顺利,除了一件事。我的控制台充满了
Attempt to decode JSON with unexpected mimetype:
和
Attempt to decode JSON with unexpected mimetype: txt/html; charset=utf-8
我的代码还有一个网站列表,它也是抓取JSON的,每个网站都不同,但我的循环基本上是相同的,我在这里简化了它:
PoolName = "http://website.com"
endpoint = "/api/stats"
headers = "headers = {'content-type': 'text/html'}" #Ive tried "application/json" and no headers
async with aiohttp.get(url=PoolName+endpoint, headers=headers) as hashrate:
hashrate = await hashrate.json()
endVariable = hashrate['GLRC']['HASH']
它工作正常,连接到站点抓取json并正确设置endVariable。但由于某种原因
Attempt to decode JSON with unexpected mimetype:
每次进行循环时都会打印。这很烦人,因为它会将统计信息打印到控制台,并且每次抓取网站json时都会丢失错误
有没有办法修复此错误或隐藏它?
答案 0 :(得分:12)
将预期内容类型传递给json()
方法:
data = await resp.json(content_type='text/html')
或完全禁用支票:
data = await resp.json(content_type=None)
答案 1 :(得分:8)
aiohttp
正在尝试do the right thing and warn you不正确的Content-Type
,这可能最糟糕地表明您根本没有获得JSON数据,而是一些不相关的内容,例如错误页面。
但是,在实践中,许多服务器配置错误,总是在其JSON响应中发送错误的MIME类型,而JavaScript库显然并不关心。如果您知道自己正在处理此类服务器,则可以通过自己调用json.loads
来使警告静音:
import json
# ...
async with self._session.get(uri, ...) as resp:
data = await resp.read()
hashrate = json.loads(data)
在尝试时指定Content-Type
没有任何区别,因为它只影响请求的Content-Type
,而问题出在服务器的Content-Type
上响应,不受您的控制。