Python Requests模块和JSON响应

4
我正在使用很棒的Requests模块来测试我们内部项目之一所创建的API。 我认为我已经发现了Requests模块本身中的一个缺陷,或者是我的使用方式有缺陷。
因为我们的数据不是超级敏感的,所以我们的API使用简单的基本HTTP身份验证来控制访问。当我使用JSON作为数据格式,使用urllib2和HTTPBasicAuthHandler或PHP和cURL对API URL进行请求时,我会得到我的数据返回为正确格式的JSON字符串 - 没有问题。
然而,当我使用Requests模块进行相同的请求时,我得到的是一个编码字符串,而我无法确定它的编码类型。这里是这个字符串的开头片段:
\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会返回该编码的数据,以及如何解码和/或“修复”它。

提前感谢!

1个回答

6

出于好奇,当您执行print r.content时,会得到什么结果?


很有趣!当我执行dir(r)时,我甚至没有看到那个方法。它输出JSON字符串。这是应该调用的方法吗,而不是read()吗? - tommytwoeyes
@waveslider 我对requests除了它在我的查找列表中之外一无所知,但是我猜测它与默认编码有关。您的开发环境可能是UTF-8(所有JSON都应该是),而服务器则是其他编码方式。我猜测.content属性正在查看所有编码标头等,并将其应用,而.read()只是从线路上拉取字节,因为它被编码不同,所以您得到了字节。再次强调,这些只是猜测。 - Hank Gay
1
你的操作系统确实有一个默认编码,但我不确定Python究竟能如何与其交互。我几乎可以确定有一种方法可以覆盖它,但我并没有直接掌握它。阅读Unicode HOWTO可能会有所帮助。最好的解决方案可能是使用.content,因为这是可行的,也是示例代码的工作方式。 - Hank Gay
谢谢 - 你说得对,我会使用 .content。这样更简单。 - tommytwoeyes
2
是的,Python确实从系统获取默认编码。这取决于Python版本、平台和配置。这里有一个深入了解的好资源:http://farmdev.com/talks/unicode/ - Kenneth Reitz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接