1. ホーム
  2. python

[解決済み】 AttributeError: 'str' オブジェクトには 'items' という属性がない

2022-02-04 10:58:58

質問

以下のコードで

#!/usr/local/bin/python
import json

APPLICATION_NAME = 'cc9226315643df89-36bf02429075329d0ba36748360d050c'

HEADERS1 = json.dumps(dict(Destination = u"/api/af/latest/applications/%s/rulesets" % (APPLICATION_NAME)))
print "Headers1 is %s" % (HEADERS1)
HEADERS2 = {'Destination': '/api/af/latest/applications/%s/rulesets' % (APPLICATION_NAME)}
print "Headers2 is %s" % (HEADERS2)

次のような出力が得られます。

Headers1 is {"Destination": "/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets"}
Headers2 is {'Destination': '/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets'}

が、requests()を使ってRESTの呼び出しでHEADER1かHEADER2のどちらかを使おうとすると、非常に異なる結果が得られます。

SERVER_URL = 'http://1.1.33.109:8087%s' % (APP_PATH)
REQ_DATA = None
print "Headers are: ", HEADERS
print "SERVER_URL is: ", SERVER_URL
print "Request Data is:", REQ_DATA
print ""

RESPONSE = requests.request(
    'MOVE', 
    SERVER_URL, 
    auth = ('admin', 'admin'), 
    verify = False, 
    data = REQ_DATA,
    headers = HEADERS1 )     #<-- If I use HEADER1 it breaks, if I use HEADER2 it works
print "Move Ruleset back to the Application RESULT: %s\n" % (RESPONSE)

HEADER1では以下のようになります。

Traceback (most recent call last):
   File "./myrest.py", line 234, in <module>
     headers = HEADERS1 )
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 44, in request
     return session.request(method=method, url=url, **kwargs)
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 324, in request
     prep = req.prepare()
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 223, in prepare
     p.prepare_headers(self.headers)
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 340, in prepare_headers
     headers = dict((name.encode('ascii'), value) for name, value in headers.items())
AttributeError: 'str' object has no attribute 'items'

HEADER2を使うときれいに実行されます。

<ブロッククオート

ルールセットをアプリケーションに戻す RESULT: レスポンス [200]

何が違うのか、どなたか説明してください。

解決方法は?

を渡しています。 文字列 ; headers できない これまで はJSONにエンコードされた文字列で、常にPythonの辞書です。

print JSONでエンコードされたオブジェクトは、Pythonの辞書表現によく似ていますが、その結果は欺瞞に満ちています。 はるか は同じものではありません。

requests API を明記しています。 headers は辞書でなければならない。

  • headers - (オプション) HTTP ヘッダと一緒に送信する辞書。 Request .

JSONデータは、他のサーバーにコンテンツとして送るもので、Python APIと通信するために使うものではありません。