web-dev-qa-db-ja.com

TypeError: 'Response'オブジェクトに属性 '__getitem__'がありません

辞書の応答オブジェクトから値を取得しようとしていますが、このエラーが発生し続けます。クラスのインデックス作成に__getitem__がより一般的に使用されていると考えるのは間違っていますか?

コードは次のとおりです。

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

応答オブジェクトはディクショナリではないため、インデックスを使用することはできません。

APIが JSON応答 を返す場合は、 response.json()メソッド を使用してPythonオブジェクト:

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

リクエストJSONデータもエンコードする必要がないことに注意してください。ここでは、request.post()メソッドにjson引数を使用できます。これにより、Content-Typeヘッダーも設定されます。

_response = requests.post(url, json=payload, auth=auth)
_

最後になりましたが、APIがプロトコルとしてJSONRPCを使用している場合は、 _jsonrpc-requests_ project を使用してメソッド呼び出しをプロキシできます。

_from jsonrpc_requests import Server

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

result = server.get_running_info()
_
12
Martijn Pieters

ソースコードを次のように少し変更するだけです:

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

 print("respone is: ", response['result'].encode('utf-8'))
_

確かに、応答オブジェクトだけではインデックスを作成できません。そのために、_json format_で情報を返す必要があります(応答情報を解析するため)。これは、json()とHereを順番に使用して行うことができます。適切な文字列を取得するには、utf-8でエンコードする必要があります(そうしないと、出力は次のようになります-u'LikeThis)

1
Nikhil Sharma