Як отримати дані JSON із служби RESTful за допомогою Python?


82

Чи існує якийсь стандартний спосіб отримання даних JSON із сервісу RESTful за допомогою Python?

Мені потрібно використовувати kerberos для автентифікації.

якийсь фрагмент допоможе.


Це може допомогти вам stackoverflow.com/questions/713847 / ...
Срінат Nannat

2
Я не шукаю " REST фреймворків на основі Python ". Я хочу використовувати службу RESTful, яку надає якийсь сервер Java у python. Все одно, дякую.
Бала

Відповіді:


78

Щось подібне повинно працювати, якщо я не пропустив суть:

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

це спрацювало б, якщо для передачі не потрібні облікові дані. Але я отримую цю помилку "urllib2.HTTPError: HTTP Error 401: Unauthorized"
Бала

Звідки ви намагаєтесь завантажити?
Труфа

1
Мені потрібно використовувати автентифікацію Kerberos. Вибачте, я забув згадати про це.
Бала

@BalamuruganK яку ОС ви використовуєте?
Труфа

Я використовую unix. намагається за допомогою kerberos lib отримати токен, щоб передати його httpConnection.putheader ('Авторизація',?)
Бала

123

Я спробував би бібліотеку запитів для цього. По суті просто набагато простіший у використанні обгортка навколо стандартних бібліотечних модулів (тобто 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 02

ось чому моя відповідь 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 для автентифікації?
Фон

3

Ну, перш за все, я думаю, що для цього потрібно розробити своє власне рішення, а все, що вам потрібно - це urllib2 або httplib2. У будь-якому випадку, якщо вам потрібен загальний клієнт REST, перевірте це.

https://github.com/scastillo/siesta

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.