分解从api调用返回的字典列表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

最近对Zabbix环境的更新打破了一些以前由比我高级得多的人编写的脚本,我目前正试图使用返回的值。

我从一个简单的API调用开始,该调用返回以下DECT:

webscenario = {
    u'httptestid': u'254', 
    u'steps': [
      {
        u'query_fields': [],
        u'name': u'GET Alert',
        u'no': u'1',
        u'url': u'http://{HOST.DNS}/{API}',
        u'follow_redirects': u'1',
        u'variables': []
        u'required': u'aries',
        u'posts': u'', 
        u'retrieve_mode': u'0', 
        u'httpstepid': u'700', 
        u'headers': [], 
        u'post_type': u'0', 
        u'timeout': u'15s', 
        u'status_codes': u'200',
        u'httptestid': u'254'
      }
    ], 
    u'name': u'Alerts API',
    u'headers': [
      {
        u'name': u'Content-Type', 
        u'value': u'application/json'
      }
    ]
}

目标是使用上述API调用中返回的数据为自动更新推送重新生成标头。

headers_dict = dict()
headers = webscenario.get("headers")

for h in str(headers).splitlines():
    headers_dict.update({h.split(':')[1].strip(): h.split(':')[1].strip())})
print headers_dict

最初,这是写成headers.splitlines()开始抛出一些错误(比如AttributeError: 'list' object has no attribute 'splitlines')有些人在谷歌上搜索,似乎添加字符串标识符解决了这个异常。但是现在我遇到了标题的格式化问题,我完全被困住了。

标题的输出是列表字典(字典列表?):

<type 'list'>: [{u'name': u'Content-Type', u'value': u'application/json'}]

我需要做的是构建一个字典,如下所示:

{Content-Type: application/json}

撇开Unicode表示法不谈,我可以解决这个“问题”(如果它甚至是一个问题),一旦我能够把它归结到我所需要的东西上。

提问于
用户回答回答于

使用API响应websenario保持其字典结构,将其传递给json.dump()。

import json

print json.dumps(websenario)

创建:

{
    "httptestid": "254",
    "steps": [{
        "httptestid": "254",
        "follow_redirects": "1",
        "variables": [],
        "status_codes": "200",
        "query_fields": [],
        "retrieve_mode": "0",
        "name": "GET Alert",
        "no": "1",
        "url": "http://{HOST.DNS}/{API}",
        "required": "aries",
        "posts": "",
        "httpstepid": "700",
        "headers": [],
        "timeout": "15s",
        "post_type": "0"
    }],
    "name": "Alerts API",
    "headers": [{
        "name": "Content-Type",
        "value": "application/json"
    }]
}

你可以把它当作data参数request.post()

要将HTTP头添加到请求中,只需将一个dict传递给Header参数即可。

# example from requests tutorial
import requests

url = 'https://api.github.com/some/endpoint'
r = requests.post(url, data=json.dumps(websenario), headers=headers)
用户回答回答于
formatted_headers = dict()
headers = webscenario.get("headers")

for header in headers:
    formatted_headers[header['name']] = header['value']

足以满足你需要达到的目标。

扫码关注云+社区

领取腾讯云代金券