Как получить данные JSON из службы RESTful с использованием Python? - PullRequest
78 голосов
/ 13 октября 2011

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

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

поможет некоторый фрагмент.

Ответы [ 5 ]

115 голосов
/ 13 октября 2011

Я бы попробовал для этого библиотеку запросов .По сути, гораздо проще использовать обертку вокруг стандартных библиотечных модулей (например, 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()
77 голосов
/ 13 октября 2011

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

import json
import urllib2
json.load(urllib2.urlopen("url"))
27 голосов
/ 13 октября 2011

Вам нужно сделать 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)
8 голосов
/ 12 июля 2015

Если вы хотите использовать 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'))
3 голосов
/ 13 октября 2011

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

https://github.com/scastillo/siesta

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

...