如何使用 urllib 向 Datadog 发送 API 密钥?

How do you send an API key to Datadog using urllib?

我目前有一个程序允许我以编程方式为 Datadog 创建和 post 仪表板。使用 API 函数 here,我能够随心所欲地成功创建、更新和删除仪表板。但是,现在我想提取我已经从 Datadog 创建的现有仪表板的骨架,以查看已添加或删除的内容。为此,我需要弄清楚如何将 API 键与请求一起发送。我可以毫无问题地获取有关板的更高级别的信息,但我想更进一步。

这是我通过调用 api.ScreenBoard.get_all()

得到的结果
{
    'screenboards': [{
        'read_only': <boolean>,
        'resource': <resource-link>,
        'description': <description>,
        'created': <date>,
        'title': <text>,
        'modified': <date>,
        'created_by': { ''' <creator information> ''' },
        'id': <table-id>
    }]
}

现在,最终目标只是从这个命令给出的 "resource" link 中提取 JSON。我尝试使用 urllib 和 urllib2 将 link 与主机站点合并(如 https://www.foo.com/{resource-link}),但我不断得到以下结果:

<addinfourl at 0000000000 whose fp = <socket._fileobject object at 0x000000000>>

{"errors": ["API key required"]}

触发此错误的代码是:

def getSkeleton(self):
    boards = self.getAll(); # utilizing the api.ScreenBoards.get_all() function
    boardList = boards['screenboards'];
    for x in boardList:
        url = self.target + x['resource']; # creating the JSON url
        data = urllib.urlopen(url).read();
        print data

如您所见,我的 "data" 变量 returns 出错了。因此,我只需要弄清楚如何发送 API 密钥以及我的解决问题的请求。如果有人知道如何执行此任务,我将不胜感激。

使用 requests 库简单多了

像这样生成一个请求头

def headers(apikey):
    return {'Authorization': 'Bearer {}'.format(apikey),
            'Content-Type': 'application/json'}

像这样发送请求

result = get(url, headers=headers(apikey))

在搜索此 other issue 时,我发现解决此问题所需要做的就是在 URL 中指定 API 密钥和应用程序密钥。考虑以下因素。

def getSkeleton(self):
    api_key = 'your api key';
    app_key = 'your application key';
    boards = self.getAll(); # utilizing the api.ScreenBoards.get_all() function
    boardList = boards['screenboards'];
    for x in boardList:
        url = self.target + x['resource'] + "?api_key=" + api_key +"&application_key=" + app_key;
        data = urllib.urlopen(url).read();
        print data