【问题标题】:Python Requests Module & JSON ResponsesPython 请求模块和 JSON 响应
【发布时间】:2011-10-23 08:36:57
【问题描述】:

我正在使用真棒 Requests module 测试我为我们的一个内部项目创建的 API。 我相信我已经发现了 Requests 模块本身的缺陷,或者我使用它的缺陷。

因为我们的数据不是超级敏感的,所以我们的 API 使用简单的基本 HTTP 身份验证来控制访问。当我使用 JSON 作为数据格式并使用带有 HTTPBasicAuthHandler 或 PHP 和 cURL 的 urllib2 请求 API URL 时,我将我的数据作为格式正确的 JSON 字符串返回 - 没问题。

但是,当我使用 Requests 模块发出相同的请求时,我得到一个编码字符串,我无法确定它是什么类型的编码。这是该字符串开头的 sn-p:

\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xadZ\xfb\x8f\xd3H\x12\xfeWzG\xab;\x90

以下是我在 Requests 中使用的几行代码来重现此问题:

import requests
# api_user and api_pw not printed here for security reasons
r = requests.get('http://ourdomain.com/api/featured/school/json', auth=(api_user, api_pw))
status = r.status_code # Produces 200 every time
rawdata = r.read()
print rawdata

每次我这样做时都会得到那个编码字符串。

谁能帮我确定: a)那是什么编码(为了我自己的教化),以及 b) 为什么 Requests 以该编码返回数据,以及如何解码和/或“修复”它。

提前致谢!

【问题讨论】:

    标签: python json http-request python-requests


    【解决方案1】:

    出于好奇,当你print r.content 时,你会得到什么?

    【讨论】:

    • 这很有趣!我什至没有看到那个方法: dir(r) 输出 JSON 字符串。那是应该调用的方法,而不是 read()?
    • 经过进一步思考,我可以看到这可能是我在图书馆末端的滥用(即 - 应该调用 r.content 而不是 r.read()),但事实并非如此解释为什么我的开发虚拟机(所有其他因素相同,在调用 r.read() 时输出 JSON 字符串)和生产框(输出该编码字符串)之间的输出不同。任何想法为什么输出不同?
    • @waveslider 我对请求一无所知,除了它在我要研究的事情清单上,但我猜我会说它与默认编码有关。您的开发盒可能是 UTF-8(所有 JSON 都应该是),而服务器则是别的东西。我猜.content 属性正在查看所有编码标头等并应用它们,而.read() 只是将字节从线路中拉出,并且由于它的编码方式不同,因此您会得到字节。同样,所有这些都只是猜测。
    • 你的操作系统确实有一个默认编码,但我不知道 Python 是如何与之交互的。我几乎肯定有一种方法可以覆盖它,但我不知道它在我的脑海中。阅读the Unicode HOWTO 可能会有所帮助。最好的解决方案可能是使用.content,因为这是有效的,并且是示例代码的工作方式。
    • 是的,Python 确实从系统中获取了默认编码。这取决于 Python 版本以及平台和配置。这是一个很好的深入信息资源:farmdev.com/talks/unicode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-08-04
    • 2014-05-07
    相关资源
    最近更新 更多