2015-09-19 44 views
6

Próbuję uzyskać wartość z obiektu odpowiedzi w słowniku, ale ciągle napotykam ten błąd, czy nie myliłem się myśląc, że numer __getitem__ jest częściej używany do indeksowanie w klasach?TypeError: Obiekt "Response" nie ma atrybutu "__getitem__"

Oto kod:

import json 
import requests 
from requests.auth import HTTPBasicAuth 

url = "http://public.coindaddy.io:4000/api/" 
headers = {'content-type': 'application/json'} 
auth = HTTPBasicAuth('rpc', '1234') 

payload = { 
    "method": "get_running_info", 
    "params": {}, 
    "jsonrpc": "2.0", 
    "id": 0, 
} 

response = requests.post(url, data=json.dumps(payload), headers=headers, auth=auth) 


print("respone is: ", response['result']) 

Odpowiedz

8

Przedmiotem odpowiedź nie jest słownikiem, nie można korzystać z indeksowania na nim.

Jeśli API zwraca JSON response, trzeba użyć response.json() method dekodować go w obiekt Pythona:

data = response.json() 
print("respone is: ", data['result']) 

pamiętać, że nie trzeba kodować dane żądanie JSON albo; można użyć tutaj argumentu json do metody request.post(); to również ustawia nagłówek Content-Type dla Ciebie:

response = requests.post(url, json=payload, auth=auth) 

Last but not least, jeśli API używa JSON-RPC jako protokół, można użyć jsonrpc-requests project metody proxy wzywa do Ciebie:

from jsonrpc_requests import Server 

url = "http://public.coindaddy.io:4000/api/" 
server = Server(url, auth=('rpc', '1234')) 

result = server.get_running_info() 
+0

Dzięki za jasne wyjaśnienie – cyclopse87

+0

gdybym mógł +2 Byłbym wdzięczny za tę odpowiedź. – cyclopse87

1

Wystarczy zmienić swój kod źródłowy trochę jak ten

odpowiedzi = requests.post (uRL, json = json.dumps (ładunku), nagłówki = nagłówki, auth = auth) .json()

print ("respone is:", odpowiedź ['result']. Encode ('utf-8'))

To prawda, że ​​obiekt odpowiedzi sam nie może być zamiast tego indeksowany, w tym celu należy zwrócić informacje w format json (w celu przeanalizowania informacji o parsowaniu), które możesz zrobić, używając json() i Tutaj, aby uzyskać poprawny ciąg, musisz go zakodować za pomocą utf-8 (w przeciwnym razie twoje wyjście będzie podobne do tego -u'LikeThis)

+0

powinieneś również dodać wyjaśnienie podobne do innych. – badiya

+0

Pewnie, dzisiaj napotkałem ten błąd, dodam później lepsze wyjaśnienie. –

Powiązane problemy