如何使用Python从RESTful服务获取JSON数据?


82

是否有使用Python从RESTful服务中获取JSON数据的标准方法?

我需要使用kerberos进行身份验证。

一些片段会有所帮助。



2
我不是来回“基于PythonREST框架”的。我想在python中使用某些Java服务器提供的RESTful服务。不管怎么说,还是要谢谢你。
巴拉(Bala)

Answers:


78

除非我没有指出要点,否则类似的事情应该起作用:

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

如果不需要通过认证,这将起作用。但我收到此“ urllib2.HTTPError:HTTP错误401:未经授权”错误
Bala

您要从哪里下载?
Trufa

1
我需要使用Kerberos身份验证。抱歉,我忘了提这个问题。
Bala

@BalamuruganK您正在使用什么操作系统?
Trufa

我正在使用Unix。尝试使用kerberos lib获取令牌以将其传递给httpConnection.putheader('Authorization',?)
Bala

123

我会为此尝试尝试请求库。从本质上讲,用于同一件事的标准库模块(即urllib2,httplib2等)的包装器使用起来要容易得多。例如,要从需要基本身份验证的网址中获取json数据,如下所示:

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

在这里,为什么我的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,2016年

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 2015年

3

首先,我认为要为此目的推出自己的解决方案是urllib2或httplib2。无论如何,如果您确实需要通用的REST客户端,请检查一下。

https://github.com/scastillo/siesta

但是我认为该库的功能集不适用于大多数Web服务,因为它们可能会使用oauth等。我也不喜欢它是通过httplib编写的,与httplib2相比,这很痛苦,如果您不必处理大量重定向等问题的话。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.