python - 属性错误 : 'str' object has no attribute 'items'

标签 python string rest dictionary http-request

在下面的代码中:

#!/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,它会干净地执行:

Move Ruleset back to the Application RESULT: Response [200]

谁能解释一下有什么区别?

最佳答案

您正在传递一个字符串headers 不能永远是一个 JSON 编码的字符串,它总是一个 Python 字典。

print 结果具有欺骗性; JSON 编码的对象看起来很像 Python 字典表示,但它们不是一回事。

requests API明确指出 headers 必须是一个字典:

  • headers – (optional) Dictionary of HTTP Headers to send with the Request.

JSON 数据是您将作为内容发送到另一台服务器的数据,而不是您用来与 Python API 通信的数据。

关于python - 属性错误 : 'str' object has no attribute 'items' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18867898/

相关文章:

Python:使用 FOR 循环插入字典

python - numpy 函数的省时组合

python - 如何将一个数据框拆分为两个数据框

c++ - 如何获取一个字符串在内存中实际占用的字节数?

c# - 无法将属性或索引器 'string.this[int]' 分配给 -- 它是只读的

java - Spring Boot - 不明确的映射

java - 使用 Java-ee-7.0 for IBM 从 Jax-rs 1.1 迁移到 2.0 时出现的问题为 9

线程中的python3 websocket

rest - 如何使用 PUT 和 DELETE 进行 REST

java - 如何从用户输入中拆分 "\n"?