2012-05-08 16 views
5

Por lo tanto, quiero utilizar Kenneth 'excelente requests module. Tropezó con este problema al tratar de usar el Freebase API.Pase un objeto JSON a una url con solicitudes

Básicamente, su API se ve así:

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

como una consulta, que esperan un objeto JSON, aquí está uno que se 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" 
}]​ 

Por supuesto, tendremos que escapar de esto antes de pasarlo a una URL, por lo que la consulta real se verá así:

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' 

Ahora,

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

porque el sitio afirma que no podría analizar la consulta.

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

No hay problema aquí, obtengo una devolución adecuada. Curiosamente,

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

¿Por qué? ¿Estoy usando el módulo incorrecto? ¿O es un error en requests?

+0

Utilice el módulo 'json', si no lo está haciendo todavía. – jdi

Respuesta

6

Funciona para mí. Esto es lo que hice:

>>> 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'}, 
.... 

Corté el resto para abreviar. Hay 100 resultados. requests.__version__ == '0.10.6'

+0

Gah Estaba escribiendo este ejemplo exacto. Dudo que OP usara el módulo json para serializar el objeto python. Probablemente estaba tratando de escapar manualmente de una cadena json. – jdi

+0

Sí, eso tendría sentido. Probablemente es por eso que no estaba analizando correctamente – jterrace

Cuestiones relacionadas