curl to python requests error: "no api key supplied"

curl to python requests error: "no api key supplied"

我正在尝试使用 python 请求执行 curl 命令。据我所知,我所做的一切都是正确的,但无论我如何尝试包含它,网站都无法识别 api 键。基本上,我要访问的站点希望将 api 键放在 url 的开头。当我使用 curl 执行此操作时,它工作得很好。但是,当我通过 python 请求尝试时,它不起作用。将其作为字典中的键值对发送也不起作用。

这个有效

curl -H "Content-Type:application/json" -d '{"ndbno":["11124"],"type":"f"}' [API KEY]@api.nal.usda.gov/ndb/V2/reports

这是请求代码:

import requests

headers = {'Content-Type': 'application/json',}

data = '{"ndbno":["11124"],"type":"f"}'

response = requests.post('http://[API KEY]@api.nal.usda.gov/ndb/V2/reports', headers=headers, data=data)

结果是 json 包含消息的响应:“{'error': {'code': 'API_KEY_MISSING', 'message': 'No api_key was supplied. Get one at http://api.nal.usda.gov:80'}} “

如果我从 url 中删除 [API KEY] 并将其作为 "api_key" 添加到数据字典中,它也不起作用:"[API 键]

顺便说一句,我没有将密钥作为列表或其他任何方式传递,我只是不想 post 我的问题中的物理密钥。

我是 python 和 Whosebug 的新手,但我已经尽职调查并一直在寻找答案并测试不同的方式来格式化请求几个小时。非常感谢任何帮助!

查看 PubAG API,您似乎可以简单地在 URL 查询字符串中传递 api_key。我假设它与您正在使用的 API 相同,但粗略搜索没有产生任何文档。

尝试: https://api.nal.usda.gov/ndb/V2/reports?api_key=[API_KEY]

response = requests.post('https://api.nal.usda.gov/ndb/V2/reports?api_key=[API_KEY]', headers=headers, data=data)

我没有 API 键来尝试这个,但是在我的浏览器中导航到 https://api.nal.usda.gov/ndb/V2/reports?api_key=asdfds 给我一个无效的 API 键错误,这表明端点识别出我给了一个 API 键。

可能是因为 requests 没有解析 URL 中的 API KEY,试试这个:

response = requests.post('http://api.nal.usda.gov/ndb/V2/reports', headers=headers, data=data, auth=(API_KEY, ''))

这使用基本身份验证 (Authorization header) 传递它,这与 curl 在解析 URL.

时的行为相同

通常在基本身份验证中,您会有用户名和密码。例如: auth=('<username>', '<password>')

因为这个 API 似乎只关心用户名,所以我将密码留空。