Python3调用NVD RESTful API发起GET请求出现JSONDecodeError如何解决?
问题排查与解决方案
这个报错的核心原因是调用的接口返回的内容不是合法JSON格式,根本原因是你构造的NVD API请求URL不符合规范,可按以下步骤排查修复:
- 第一步:先加调试逻辑确认请求状态,不要直接调用
.json()方法,先打印响应状态码和原始返回内容,排查是不是请求本身出错(比如404、403、被限流)
调试代码示例:
运行这段代码会看到状态码为404,说明你请求的路径不存在,返回的是404错误页内容,自然无法解析为JSON。import requests response = requests.get('https://services.nvd.nist.gov/rest/json/CVE-2021-40463/1.0/') # 打印状态码 print("响应状态码:", response.status_code) # 打印前500字符的原始返回内容,避免输出过长 print("返回原始内容:", response.text[:500]) - 第二步:修正API请求URL,单CVE查询的正确请求格式是把CVE编号作为
cveId查询参数传递,使用标准的cves/2.0接口路径,正确的URL格式为https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-40463 - 第三步:补充可选优化配置,NVD API对未携带密钥的请求有6次/分钟的速率限制,低频请求可以不用密钥,请求频繁可以申请API密钥放到请求头中;也可以补充User-Agent头避免被服务端拦截。
修正后的完整可运行代码:
import requests # 基础接口地址 url = "https://services.nvd.nist.gov/rest/json/cves/2.0" params = { "cveId": "CVE-2021-40463" } # 补充请求头避免被拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" # 有API密钥可以新增配置:"apiKey": "你的NVD API密钥" } response = requests.get(url, params=params, headers=headers) # 先判断请求是否成功再解析JSON if response.status_code == 200: cve_data = response.json() print(cve_data) else: print(f"请求失败,状态码:{response.status_code},错误信息:{response.text}")
内容的提问来源于stack exchange,提问作者Alexandra
相关产品推荐
相关产品推荐

