API GET调用中的身份验证问题

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

我正在尝试使用美国农业部网站上描述的食品数据中心REST API访问基本食品信息:

对于这个项目,我使用R中的httr v 1.3.1包进行调用

API调用的文档似乎很好,并提供了一些示例;不幸的是,这些示例都没有使用R,而且由于我对API开发知之甚少,我不确定文档的内容应该如何翻译给我。本文档提供了以下示例:

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)