Làm cách nào để lấy dữ liệu JSON từ dịch vụ RESTful bằng Python?


82

Có cách tiêu chuẩn nào để lấy dữ liệu JSON từ dịch vụ RESTful bằng Python không?

Tôi cần sử dụng kerberos để xác thực.

một số đoạn mã sẽ hữu ích.


Điều này có thể giúp bạn stackoverflow.com/questions/713847/...
Sreenath Nannat

2
Tôi không tìm kiếm "các khuôn khổ REST dựa trên Python ". Tôi muốn sử dụng dịch vụ RESTful được cung cấp bởi một số máy chủ java trong python. Dẫu sao cũng xin cảm ơn.
Bala

Câu trả lời:


78

Một cái gì đó như thế này sẽ hoạt động trừ khi tôi thiếu điểm:

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

điều này sẽ hoạt động nếu không có thông tin xác thực cần thiết để vượt qua. Nhưng tôi nhận được lỗi này "urllib2.HTTPError: HTTP Error 401: Unauthorized"
Bala

Bạn đang cố gắng tải xuống từ đâu?
Trufa

1
Tôi cần sử dụng xác thực Kerberos. Xin lỗi, tôi quên đề cập trong câu hỏi.
Bala

@BalamuruganK bạn đang sử dụng hệ điều hành nào?
Trufa 13/10/11

Tôi đang sử dụng unix. đang cố gắng với kerberos lib để lấy mã thông báo để chuyển nó đến httpConnection.putheader ('Ủy quyền',?)
Bala

123

Tôi sẽ thử thư viện yêu cầu cho việc này. Về cơ bản chỉ là một trình bao bọc dễ sử dụng hơn nhiều xung quanh các mô-đun thư viện tiêu chuẩn (tức là urllib2, httplib2, v.v.) mà bạn sẽ sử dụng cho cùng một thứ. Ví dụ: để tìm nạp dữ liệu json từ một url yêu cầu xác thực cơ bản sẽ giống như sau:

import requests

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

Để xác thực kerberos, dự án yêu cầu có thư viện reqests-kerberos cung cấp lớp xác thực kerberos mà bạn có thể sử dụng với các yêu cầu :

import requests
from requests_kerberos import HTTPKerberosAuth

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

5
Nếu bạn đang thiếu các requestsmô-đun, bạn chỉ cần làm: pip install requests. Thêm thông tin và tài liệu tại đây
benscabbia

ở đây tại sao phản hồi json của tôi trở thành với u trước cặp khóa, giá trị? {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 giây'}
KARTHIKEYAN.A

27

Về cơ bản, bạn cần thực hiện một yêu cầu HTTP tới dịch vụ, sau đó phân tích cú pháp phần thân của phản hồi. Tôi thích sử dụng httplib2 cho nó:

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

Nếu bạn muốn sử dụng Python 3, bạn có thể sử dụng như sau:

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

Làm thế nào để điều này sử dụng kerberos để xác thực?
Foon

3

Trước hết, tôi nghĩ rằng đưa ra giải pháp của riêng bạn cho tất cả những gì bạn cần là urllib2 hoặc httplib2. Dù sao trong trường hợp bạn yêu cầu một ứng dụng khách REST chung, hãy kiểm tra điều này.

https://github.com/scastillo/siesta

Tuy nhiên, tôi nghĩ rằng bộ tính năng của thư viện sẽ không hoạt động đối với hầu hết các dịch vụ web vì chúng có thể sẽ sử dụng oauth, v.v. Ngoài ra, tôi không thích thực tế là nó được viết trên httplib, điều này gây khó khăn so với httplib2 vẫn sẽ hoạt động cho bạn nếu bạn không phải xử lý nhiều chuyển hướng, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.