Jak uzyskać dane JSON z usługi RESTful przy użyciu języka Python?


83

Czy istnieje standardowy sposób pobierania danych JSON z usługi RESTful przy użyciu języka Python?

Do uwierzytelnienia potrzebuję protokołu Kerberos.

jakiś fragment mógłby pomóc.



2
Nie szukam " frameworków REST opartych na Pythonie". Chcę skorzystać z usługi RESTful dostarczanej przez jakiś serwer java w Pythonie. W każdym razie dzięki.
Bala

Odpowiedzi:


78

Coś takiego powinno działać, chyba że nie rozumiem:

import json
import urllib2
json.load(urllib2.urlopen("url"))

to zadziała, jeśli nie ma poświadczeń wymaganych do przejścia. Ale pojawia się ten błąd „urllib2.HTTPError: HTTP Error 401: Unauthorized”
Bala

Skąd próbujesz pobrać?
Trufa

1
Muszę używać uwierzytelniania Kerberos. Przepraszam, zapomniałem wspomnieć o pytaniu.
Bala

@BalamuruganK jakiego systemu operacyjnego używasz?
Trufa

Używam unixa. próba z kerberos lib, aby uzyskać token, aby przekazać go do httpConnection.putheader ('Authorization',?)
Bala

124

Dałbym żądań Library okazję do tego. Zasadniczo jest to po prostu dużo łatwiejsze w użyciu opakowanie wokół standardowych modułów biblioteki (tj. Urllib2, httplib2 itp.), Których używałbyś do tego samego. Na przykład pobranie danych json z adresu URL wymagającego podstawowego uwierzytelnienia wyglądałoby następująco:

import requests

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

W przypadku uwierzytelniania Kerberos projekt żądań zawiera bibliotekę reqests-kerberos, która zapewnia klasę uwierzytelniania Kerberos, której można używać z żądaniami :

import requests
from requests_kerberos import HTTPKerberosAuth

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

5
Jeśli brakuje requestsmodułu, po prostu zrobić: pip install requests. Więcej informacji i dokumentów tutaj
benscabbia

dlaczego moja odpowiedź json staje się u przed parą klucz, wartość? {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

Zasadniczo musisz wysłać żądanie HTTP do usługi, a następnie przeanalizować treść odpowiedzi. Lubię używać do tego httplib2:

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)

10

Jeśli chcesz używać Pythona 3, możesz użyć następujących:

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'))

Jak to wykorzystuje Kerberos do uwierzytelniania?
Foon

3

Przede wszystkim myślę, że wdrożenie własnego rozwiązania do tego wszystkiego, czego potrzebujesz, to urllib2 lub httplib2. W każdym razie, jeśli potrzebujesz ogólnego klienta REST, sprawdź to.

https://github.com/scastillo/siesta

Jednak myślę, że zestaw funkcji biblioteki nie będzie działał dla większości usług internetowych, ponieważ prawdopodobnie będą one używać oauth itp.. Nie podoba mi się również fakt, że jest napisany przez httplib, co jest uciążliwe w porównaniu do httplib2, ale nadal powinno działać, jeśli nie musisz obsługiwać wielu przekierowań itp.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.