2015-09-19 16 views
6

Sto cercando di ottenere un valore da un oggetto risposta in un dizionario, ma continuo a correre in questo errore, ho sbagliato nel pensare che lo __getitem__ sia più comunemente usato per indicizzazione in classi?TypeError: L'oggetto 'Response' non ha attributo '__getitem__'

Ecco il codice:

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

risposta

8

L'oggetto risposta non è un dizionario, non è possibile utilizzare l'indicizzazione su di esso.

Se l'API restituisce un JSON response, è necessario utilizzare il response.json() method per decodificare a un oggetto Python:

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

Si noti che non c'è bisogno di codificare i dati JSON richiesta sia; puoi semplicemente utilizzare l'argomento json per il metodo request.post() qui; questa imposta anche l'header Content-Type per voi:

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

Ultimo ma non meno importante, se l'API utilizza JSONRPC come protocollo, è possibile utilizzare il jsonrpc-requests project al metodo proxy chiamate per voi:

from jsonrpc_requests import Server 

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

result = server.get_running_info() 
+0

Ottenuto grazie per la chiara spiegazione – cyclopse87

+0

se potessi +2, sarei davvero grato a questa risposta. – cyclopse87

1

Basta modificare il codice sorgente di un po 'come questo

risposta = requests.post (url, jSON = json.dumps (payload), le intestazioni = intestazioni, auth = auth) .json()

print ("rispone is:", response ['result']. Encode ('utf-8'))

È vero che l'oggetto risposta da solo non può essere indicizzato invece a tale scopo è necessario restituire informazioni in formato json (in ordine parse response information) che puoi fare usando json() e Qui per ottenere una stringa corretta devi codificarlo con utf-8 (altrimenti l'output sarà qualcosa come questo -u'LikeThis)

+0

dovresti anche aggiungere una spiegazione come le altre. – badiya

+0

Certo, ho riscontrato questo errore oggi, aggiungerò una spiegazione migliore più avanti. –

Problemi correlati