Как получить данные JSON из службы RESTful с помощью Python?

83

Есть ли стандартный способ получения данных JSON из службы RESTful с помощью Python?

Мне нужно использовать Kerberos для аутентификации.

какой-нибудь фрагмент поможет.

Бала
источник
Это может помочь вам stackoverflow.com/questions/713847/…
Sreenath Nannat
2
Я не ищу « фреймворков REST на основе Python». Я хочу использовать службу RESTful, предоставляемую некоторым java-сервером на python. Спасибо, в любом случае.
Бала,

Ответы:

78

Что-то вроде этого должно работать, если я не упущу суть:

import json
import urllib2
json.load(urllib2.urlopen("url"))
Труфа
источник
это сработает, если для прохождения не требуются учетные данные. Но я получаю эту ошибку "urllib2.HTTPError: HTTP Error 401: Unauthorized"
Бала,
Откуда вы пытаетесь скачать?
Trufa
1
Мне нужно использовать аутентификацию Kerberos. Извините, я забыл упомянуть этот вопрос.
Бала,
@BalamuruganK какую ОС вы используете?
Trufa
Я использую unix. пытается с помощью kerberos lib получить токен для передачи его в httpConnection.putheader ('Авторизация',?)
Бала,
124

Я бы попробовал для этого библиотеку запросов . По сути, гораздо проще использовать оболочку для стандартных библиотечных модулей (например, urllib2, httplib2 и т. Д.), Которые вы использовали бы для того же. Например, получение данных json с URL-адреса, требующего базовой аутентификации, будет выглядеть так:

import requests

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

Для проверки подлинности Kerberos в проекте запросов есть библиотека reqests-kerberos, которая предоставляет класс проверки подлинности Kerberos, который вы можете использовать с запросами :

import requests
from requests_kerberos import HTTPKerberosAuth

response = requests.get('http://thedataishere.com',
                         auth=HTTPKerberosAuth())
data = response.json()
Марк Геммилл
источник
5
Если вы пропустили requestsмодуль, просто сделать: pip install requests. Больше информации и документов здесь
benscabbia
вот почему мой ответ json становится с u перед парой ключ, значение? {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

По сути, вам нужно сделать HTTP-запрос к службе, а затем проанализировать тело ответа. Мне нравится использовать для этого 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

Если вы хотите использовать Python 3, вы можете использовать следующее:

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'))
Андре Висплингхофф
источник
Как это использует Kerberos для аутентификации?
Foon
3

Прежде всего, я думаю, что для этого нужно развернуть собственное решение. Все, что вам нужно, это urllib2 или httplib2. В любом случае, если вам нужен общий клиент REST, проверьте это.

https://github.com/scastillo/siesta

Однако я думаю, что набор функций библиотеки не будет работать для большинства веб-сервисов, потому что они, вероятно, будут использовать oauth и т. Д. Также мне не нравится тот факт, что он написан поверх httplib, что неудобно по сравнению с httplib2, все равно должно работать для вас, если вам не нужно обрабатывать много перенаправлений и т. Д.

необычный
источник