2011-08-09 161 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()'只是將這些字節從線上拉開,並且由於它的編碼方式不同, 。再次,所有這些只是猜測。 –