¿Cómo obtengo datos JSON del servicio RESTful usando Python?

82

¿Existe alguna forma estándar de obtener datos JSON del servicio RESTful usando Python?

Necesito usar kerberos para la autenticación.

algún fragmento ayudaría.

Bala
fuente
Esto puede ayudarlo a stackoverflow.com/questions/713847/…
Sreenath Nannat
2
No estoy buscando "marcos REST basados ​​en Python ". Quiero usar el servicio RESTful proporcionado por algún servidor java en python. Gracias de cualquier manera.
Bala

Respuestas:

78

Algo como esto debería funcionar a menos que me pierda el punto:

import json
import urllib2
json.load(urllib2.urlopen("url"))
Trufa
fuente
esto funcionaría si no se requiere una credencial para aprobar. Pero recibo este error "urllib2.HTTPError: Error HTTP 401: No autorizado"
Bala
¿De dónde estás intentando descargar?
Trufa
1
Necesito usar la autenticación Kerberos. Lo siento, olvidé mencionar en cuestión.
Bala
@BalamuruganK ¿qué sistema operativo estás usando?
Trufa
Estoy usando Unix. tratando con kerberos lib para obtener el token para pasarlo a httpConnection.putheader ('Autorización',?)
Bala
123

Le daría una oportunidad a la biblioteca de solicitudes para esto. Esencialmente, un contenedor mucho más fácil de usar alrededor de los módulos de la biblioteca estándar (es decir, urllib2, httplib2, etc.) que usaría para lo mismo. Por ejemplo, para obtener datos json de una URL que requiere autenticación básica se vería así:

import requests

response = requests.get('http://thedataishere.com',
                         auth=('user', 'password'))
data = response.json()

Para la autenticación kerberos, el proyecto de solicitudes tiene la biblioteca reqests-kerberos que proporciona una clase de autenticación kerberos que puede usar con las solicitudes :

import requests
from requests_kerberos import HTTPKerberosAuth

response = requests.get('http://thedataishere.com',
                         auth=HTTPKerberosAuth())
data = response.json()
Mark Gemmill
fuente
5
Si se está perdiendo el requestsmódulo, sólo tiene que hacer: pip install requests. Más información y documentos aquí
benscabbia
aquí, ¿por qué mi respuesta json se convierte en u antes de la clave, el par de valores? {u'status ': u'FINISHED', u'startTime ': u'2016-11-08T15: 32: 33.241Z', u'jobId ': u'f9d71eaa-d439-4a39-a258-54220b14f1b8', u ' context ': u'sql-context', u'duration ': u'0.061 secs'}
KARTHIKEYAN.A
27

Básicamente, debe realizar una solicitud HTTP al servicio y luego analizar el cuerpo de la respuesta. Me gusta usar httplib2 para ello:

import httplib2 as http
import json

try:
    from urlparse import urlparse
except ImportError:
    from urllib.parse import urlparse

headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json; charset=UTF-8'
}

uri = 'http://yourservice.com'
path = '/path/to/resource/'

target = urlparse(uri+path)
method = 'GET'
body = ''

h = http.Http()

# If you need authentication some example:
if auth:
    h.add_credentials(auth.user, auth.password)

response, content = h.request(
        target.geturl(),
        method,
        body,
        headers)

# assume that content is a json reply
# parse content with the json module
data = json.loads(content)
Christo Buschek
fuente
10

Si desea utilizar Python 3, puede utilizar lo siguiente:

import json
import urllib.request
req = urllib.request.Request('url')
with urllib.request.urlopen(req) as response:
    result = json.loads(response.readall().decode('utf-8'))
Andre Wisplinghoff
fuente
¿Cómo usa kerberos para la autenticación?
Foon
3

Bueno, en primer lugar, creo que implementar su propia solución para esto, todo lo que necesita es urllib2 o httplib2. De todos modos, en caso de que necesite un cliente REST genérico, consulte esto.

https://github.com/scastillo/siesta

Sin embargo, creo que el conjunto de características de la biblioteca no funcionará para la mayoría de los servicios web porque probablemente usarán oauth, etc. Además, no me gusta el hecho de que esté escrito sobre httplib, que es un fastidio en comparación con httplib2, pero debería funcionar para usted si no tiene que manejar muchas redirecciones, etc.

inusual
fuente