2011-08-09 52 views
4

我正在使用真棒 Requests module来测试我为其中一个内部项目创建的API。 我相信我已经发现Requests模块本身有什么缺陷,或者是我的使用缺陷。Python请求模块和JSON响应

由于我们的数据不是非常敏感,我们的API使用简单的基本HTTP身份验证来控制访问。当我提出API URL请求时,使用JSON作为数据格式,或者使用带有HTTPBasicAuthHandler的urllib2,或者使用PHP和cURL,我将数据恢复为格式正确的JSON字符串 - 没有问题。

但是,当我使用Requests模块发出相同的请求时,我找回了一个编码字符串,并且我无法确定它是什么类型的编码。下面是字符串的开头的一个片段:

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

下面是几行代码,我用请求使用重现此问题:

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 

而我得到的每一次编码的字符串我这样做。

谁能帮我确定: 一)这是什么编码(我自己的熏陶),和 二)为何要求在该编码返回数据,以及如何解码和/或“修理”它。

在此先感谢!

回答

6

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

+0

这很有趣!当我这样做时,我甚至没有看到该方法:dir(r) 输出JSON字符串。那是应该被调用的方法,而不是read()? – tommytwoeyes

+0

经过进一步的思考,我可以看到这可能是我在图书馆一端的滥用(例如 - 应该叫r.content而不是r.read()),但它不能解释为什么输出不同我的开发虚拟机(所有其他因素相同,在调用r.read()时输出JSON字符串)和生产框(输出该编码字符串)。 任何想法为什么输出是不同的? – tommytwoeyes

+0

@waveslider我不知道任何有关请求的信息,除了它在我要查看的事物清单上,但是我猜测它与默认编码有关。你的开发盒可能是UTF-8(所有的JSON应该是这样),而服务器是其他的东西。我猜''.content'属性正在查看所有的编码标题等,并应用它们,而'.read()'只是将这些字节从线上拉开,并且由于它的编码方式不同, 。再次,所有这些只是猜测。 –