AttributeError: 'str' object has no 'items' attributes

In the following code:

#!/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) 

I get the following output:

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

but when I try to use HEADER1 or HEADER2 in a REST call using queries (), I get very different results:

 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) 

I get the following: 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' 

If I use HEADER2, it runs cleanly:

Move the rule set back to the application. RESULT: Response [200]

Can anyone explain what the differences are?

+6
source share
2 answers

You pass the string; headers never be a JSON encoded string; it is always a Python dictionary.

print results are misleading; JSON encoded objects are very similar to Python dictionary views, but they are far from the same.

requests API clearly states that headers should be a dictionary:

  • headers - (optional) A dictionary of HTTP headers to send using Request .

JSON data is what you sent as content to another server, and not what you used to communicate with the Python API.

+8
source

I had this problem and I needed to create a header with a content type and pass the data item as json.

 import requests import json headerInfo = {'content-type': 'application/json' } payload = {'text': 'okay!!!', 'auth_token': 'aasdasdasdasd'} jLoad = json.dumps(payload) r = requests.post('http://example.com:3030/widgets/init', headers=headerInfo, data=jLoad) print r.text print r.status_code 
+1
source

Source: https://habr.com/ru/post/954044/


All Articles