API GET调用中的身份验证问题
我正在尝试使用美国农业部网站上描述的食品数据中心REST API访问基本食品信息: 对于这个项目,我使用R中的httr v 1.3.1包进行调用 API调用的文档似乎很好,并提供了一些示例;不幸的是,这些示例都没有使用R,而且由于我对API开发知之甚少,我不确定文档的内容应该如何翻译给我。本文档提供了以下示例:API GET调用中的身份验证问题,api,httr,Api,Httr,我正在尝试使用美国农业部网站上描述的食品数据中心REST API访问基本食品信息: 对于这个项目,我使用R中的httr v 1.3.1包进行调用 API调用的文档似乎很好,并提供了一些示例;不幸的是,这些示例都没有使用R,而且由于我对API开发知之甚少,我不确定文档的内容应该如何翻译给我。本文档提供了以下示例: curl -H "Content-Type:application/json" -d '{"generalSearchInput":"Cheddar cheese"}' -X POS
curl -H "Content-Type:application/json"
-d '{"generalSearchInput":"Cheddar cheese"}'
-X POST
https://DEMO_KEY@api.nal.usda.gov/fdc/v1/search
我看到一个内容类型头和一个主体,其中字符串Cheddar cheese被提供给一个名为generalSearchInput的参数。似乎我还需要用自己的API密钥替换“DEMO_KEY”字符串
我宁愿不共享我自己的API密钥,而是单击链接,输入姓名/电子邮件,几秒钟后获得密钥,甚至不必确认电子邮件
下面是我在httr包中复制此调用的尝试:
这也许并不奇怪。我被几个问题困住了:
如何正确地将API密钥传递给调用?我尝试使用基本HTTP身份验证,即密钥作为用户名和空密码,但我认为这样做不对。根据,您可以通过以下方式在POST请求正文中包含JSON数据:
httr::POST(
url = "https://api.nal.usda.gov/fdc/v1/search",
authenticate(user = "<MyAPIKey>", password = "", type = "basic"),
body = list(generalSearchInput = "Cheddar cheese"),
encode = "json"
)
不确定您是否仍在处理此问题,但我从Github上的某个人那里找到的这段代码可能会有所帮助。它一直在为我工作。您只需要填写apiKey和一个特定的foodID 导入请求 导入json 如果您希望将响应添加到数据帧,以便更容易使用此处未显示的代码,请将pandas导入为pd apiKey= foodID= def营养素_Apikey,foodID: 调用获取api和json加载 api_resp=json.loadsrequests.get+foodID+'?api_key='+apiKey.text 只返回营养信息 api_营养素=api_resp['foodNutrients'] 第一个条目是它的描述、foodID和数据库条目类型 nutrientDict={FoodID:[api_resp['description'],FoodID,api_resp['dataType']}
for items in api_nutrients:
if 'amount' in items:
#each entry includes nutrient name, nutrient id, amount, and its respective unit
nutrientDict.update({(items['nutrient']['name']): [(items['nutrient']['id']),
(items['amount']),(items['nutrient']['unitName'])]})
#print(nutrientDict)
return(nutrientDict)
感谢@Kenna,我更新了API调用。现在看来,主机正在接收并识别请求,尽管它仍然无法识别我传递API密钥的方式。我已经输入了一条更新的错误消息来演示新的结果;这回答了我关于将参数传递给主机的部分问题,但由于某些原因,他们仍然不喜欢我传递API密钥的方式……问题已更新以演示。再次感谢!我收回我先前的声明!很明显,我请求的API密钥不再有效,正如更新的错误消息所暗示的那样。。。!谢谢你的帮助!我很高兴能帮上忙!
httr::POST(
url = "https://api.nal.usda.gov/fdc/v1/search",
authenticate(user = "<MyAPIKey>", password = "", type = "basic"),
body = list(generalSearchInput = "Cheddar cheese"),
encode = "json"
)
for items in api_nutrients:
if 'amount' in items:
#each entry includes nutrient name, nutrient id, amount, and its respective unit
nutrientDict.update({(items['nutrient']['name']): [(items['nutrient']['id']),
(items['amount']),(items['nutrient']['unitName'])]})
#print(nutrientDict)
return(nutrientDict)