Python kullanarak RESTful hizmetinden JSON verilerini nasıl alırım?


83

Python kullanarak RESTful hizmetinden JSON verisi almanın standart bir yolu var mı?

Kimlik doğrulama için kerbero kullanmam gerekiyor.

bazı pasajlar yardımcı olabilir.



2
"Python tabanlı REST çerçeveleri" için bakmıyorum . Python'da bazı java sunucuları tarafından sağlanan RESTful hizmetini kullanmak istiyorum. Yine de teşekkürler.
Bala

Yanıtlar:


78

Asıl noktayı kaçırmıyorsam böyle bir şey işe yaramalı:

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

Bu, geçmek için gerekli bir kimlik bilgisi yoksa işe yarar. Ama bu "urllib2.HTTPError: HTTP Hatası 401: Yetkisiz" hatasını alıyorum
Bala

Nereden indirmeye çalışıyorsun?
Trufa

1
Kerberos kimlik doğrulamasını kullanmam gerekiyor. Üzgünüm, söz konusu olduğunda bahsetmeyi unuttum.
Bala

@BalamuruganK hangi işletim sistemini kullanıyorsunuz?
Trufa

Unix kullanıyorum. kerberos lib ile token'ı httpConnection.putheader'a ('Yetkilendirme',?) iletmek için denemek
Bala

124

Bunun için istek kütüphanesine bir şans verirdim. Esasen, aynı şey için kullanacağınız standart kütüphane modülleri (yani urllib2, httplib2, vb.) Etrafında sarmalayıcı kullanmak çok daha kolaydır. Örneğin, temel kimlik doğrulama gerektiren bir url'den json verilerini almak şu şekilde görünür:

import requests

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

Kerberos kimlik doğrulaması için, istek projesi , isteklerle kullanabileceğiniz bir kerberos kimlik doğrulama sınıfı sağlayan reqests-kerberos kitaplığına sahiptir :

import requests
from requests_kerberos import HTTPKerberosAuth

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

5
Eğer gelmediyse requestsmodülü, sadece yapın: pip install requests. Daha fazla bilgi ve dokümanlar burada
benscabbia

burada neden json yanıtım anahtar, değer çiftinden önce u ile oluyor? {u'status ': u'FINISHED', u'startTime ': u'2016-11-08T15: 32: 33.241Z', u'jobId ': u'f9d71eaa-d439-4a39-a258-54220b14f1b8', u ' bağlam ': u'sql-bağlam', u'duration ': u'0.061 saniye'}
KARTHIKEYAN. A

27

Temel olarak hizmete bir HTTP isteği göndermeniz ve ardından yanıtın gövdesini ayrıştırmanız gerekir. Bunun için httplib2 kullanmayı seviyorum:

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'ü kullanmak istiyorsanız, aşağıdakileri kullanabilirsiniz:

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

Bu, kimlik doğrulama için kerberoları nasıl kullanır?
Foon

3

Öncelikle bunun için kendi çözümünüzü sunmanın tek ihtiyacınız olan urllib2 veya httplib2 olduğunu düşünüyorum. Her neyse, genel bir REST istemcisine ihtiyacınız olursa, bunu kontrol edin.

https://github.com/scastillo/siesta

Bununla birlikte, kütüphanenin özellik setinin çoğu web servisi için çalışmayacağını düşünüyorum çünkü muhtemelen oauth vb. Kullanacaklardır. Ayrıca, httplib2 ile karşılaştırıldığında bir sıkıntı olan httplib üzerine yazılması hoşuma gitmiyor, eğer çok fazla yeniden yönlendirme vb. İle uğraşmak zorunda değilseniz, yine de sizin için çalışmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.