2012-05-08 8 views
5

Quindi, desidero utilizzare l'eccellente requests module di Kenneth. È incappato in questo problema durante il tentativo di utilizzare il Freebase API.Passare un oggetto JSON a un URL con richieste

In sostanza, le loro API sembra che:

https://www.googleapis.com/freebase/v1/mqlread?query=... 

come una query, si aspettano un oggetto JSON, ecco uno che return a list of wines with their country and percentage of alcohol:

[{ 
    "country":  null, 
    "name":   null, 
    "percentage_alcohol": null, 
    "percentage_alcohol>": 0, 
    "type":   "/food/wine" 
}]​ 

Naturalmente, dovremo sfuggire all'inferno da questo prima di passarlo a un URL, quindi la query effettiva sarà simile a questa:

fullurl = 'https://www.googleapis.com/freebase/v1/mqlread?query=%5B%7B%22percentage_alcohol%3E%22%3A+0%2C+%22country%22%3A+null%2C+%22type%22%3A+%22%2Ffood%2Fwine%22%2C+%22name%22%3A+null%2C+%22percentage_alcohol%22%3A+null%7D%5D' 

Ora,

r = requests.get(fullurl) 
print r.status_code 
>>> 400 

perché il sito afferma che non poteva analizzare la query.

r2 = urllib2.urlopen(fullurl) 
print r2.getcode() 
>>> 200 

Nessun problema, ho ottenuto un ritorno adeguato. È interessante notare che

# This is the url of our requests.get request 
print urllib2.urlopen(r.url).getcode() 
>>> 200 

Perché? Sto usando il modulo sbagliato? O è un bug in requests?

+0

Utilizzare il modulo 'json', se non lo si è già. – jdi

risposta

6

Funziona per me. Ecco cosa ho fatto:

>>> params = [{"country": None, 
...   "name": None, 
...   "percentage_alcohol": None, 
...   "percentage_alcohol>": 0, 
...   "type": "/food/wine" 
...   }] 
>>> import json 
>>> params_json = json.dumps(params) 

>>> import requests 
>>> url = "https://www.googleapis.com/freebase/v1/mqlread?query=%s" 
>>> r = requests.get(url % params_json) 
>>> r.status_code 
200 

>>> content_json = json.loads(r.content) 
>>> import pprint 
>>> pprint.pprint(content_json) 
{u'result': [{u'country': u'New Zealand', 
       u'name': u'2003 Cloudy Bay Sauvignon Blanc', 
       u'percentage_alcohol': 13.5, 
       u'type': u'/food/wine'}, 
      {u'country': u'France', 
       u'name': u'G.H. Mumm Cordon Rouge Brut', 
       u'percentage_alcohol': 12.0, 
       u'type': u'/food/wine'}, 
.... 

Ho interrotto il resto per brevità. Ci sono 100 risultati. requests.__version__ == '0.10.6'

+0

Gah Stavo solo digitando questo esatto esempio. Dubito che l'OP stia usando il modulo json per serializzare l'oggetto python. Probabilmente stava cercando di sfuggire manualmente a una stringa json. – jdi

+0

Sì, avrebbe senso. Probabilmente è perché non stava analizzando correttamente – jterrace