使用令牌在Python中发出API请求-语法错误

时间:2020-06-22 03:49:00

标签: python ajax curl

我是Python的新手,正在尝试在Jupyter笔记本中使用需要令牌的API。该API来自NOAA。

我以NOAA's website上给出的格式提出了请求。下面的所有内容实际上都是我在代码中输入的内容,但令牌本身除外,已替换为MYLONGTOKEN:

curl -H "token:<MYLONGTOKEN>" "https://www.ncdc.noaa.gov/cdo-web/api/v2/stations"
$.ajax({ url:<url>, data:{<data>}, headers:{ token:<token> } })

在MYLONGTOKEN之后,我返回了指向“的语法错误。我尝试将其从括号和引号中删除,添加空格等,但似乎无法摆脱该错误。我也不清楚如果第二行中的应该被替换为实际的令牌,但是我没有超过第一行中的错误来找出答案。

我还尝试遵循a previous post提供的不同语法,但这给了我JSONDECODE错误。

我正在使用python3,想知道NOAA的代码是否过时。

感谢您的帮助!谢谢。

1 个答案:

答案 0 :(得分:1)

Python示例代码:

import requests

token = "setljksetaafjlkasetaljksetasetdt"  # not a real access key obviously

url = "https://www.ncdc.noaa.gov/cdo-web/api/v2/stations"

response = requests.get(url, headers={'token': token})

data = response.json()
results = data["results"]

print("num results {}".format(len(results)))

for result in results[:2]:  # show first two results
    print()
    for k, v in result.items():
        print("{} => {}".format(k, v))

输出:

num results 25

elevation => 139
elevationUnit => METERS
mindate => 1948-01-01
longitude => -85.2482
name => ABBEVILLE, AL US
datacoverage => 0.8813
id => COOP:010008
latitude => 31.5702
maxdate => 2014-01-01

elevation => 249.3
elevationUnit => METERS
mindate => 1938-01-01
longitude => -87.1814
name => ADDISON, AL US
datacoverage => 0.5059
id => COOP:010063
latitude => 34.2553
maxdate => 2015-11-01

注意:大概不同的端点在JSON内返回不同的结构。上面的示例基于我使用您在问题中引用的stations URL找到的内容。查看response.json()返回的数据以查看得到的结果,因为我不知道所有不同端点的结果是否必然包含一个称为'results'的元素。

在他们的文档中,curl ...的意义在于,如果要从Linux命令行而不是Python脚本中调用 ,则可以执行以下操作:

curl -H "token:setljksetaafjlkasetaljksetasetdt" "https://www.ncdc.noaa.gov/cdo-web/api/v2/stations"

所以这就是说(因为curl中的-H选项用于添加标题)是您需要添加一个名为token的http请求标题,在上面的Python代码中使用通过headers参数传递到requests.get调用的字典。

分别在下一行,它们还提供了一个通过Ajax调用进行访问的示例。