Python调用edination接口报JSONDecodeError及对接KNIME问题咨询
问题原因
json.decoder.JSONDecodeError 触发的核心逻辑是:执行r.json()时,HTTP响应的正文不是合法JSON格式。结合你的代码,具体问题点如下:
- 鉴权头未传入请求:你提前定义了存订阅密钥的
headers变量,但调用requests.post()时没有传入headers参数,接口无法识别你的访问权限,会直接返回401类错误的纯文本/HTML错误页,自然无法按JSON解析。 - 冗余错误导入:开头
from importlib.metadata import files属于完全无用的导入代码,虽然你后续对files变量重新赋值没有直接引发变量冲突,但属于无意义的冗余内容。 - 缺少响应状态校验:代码没有先判断接口请求是否成功,不管返回200正常响应还是4xx/5xx错误,都直接调用
r.json(),只要接口返回非JSON内容就会触发报错。 - 文件资源未做回收处理:直接打开本地文件上传没有做上下文管理,程序运行过程中可能出现文件句柄泄漏的问题。
修正后可运行代码
import requests import json url = 'https://api.edination.com/v2/edifact/read' headers = { 'Ocp-Apim-Subscription-Key': '3ecf6b1c5cf34bd797a5f4c57951a1cf', 'Accept': 'application/json' } file_path = 'C:\\Users\\hcharafeddine\\Desktop\\EDI\\Interchange_1654767219416.edi' # 用上下文管理器自动处理文件关闭 with open(file_path, 'rb') as f: files = {'file': f} r = requests.post(url, headers=headers, files=files) # 先校验请求状态,非200状态直接打印错误信息方便排查 if r.status_code != 200: print(f"接口请求失败,状态码:{r.status_code},响应内容:{r.text}") else: # 确认响应成功后再解析JSON edi_parse_result = r.json() # 把结果存为本地JSON文件,方便后续传入KNIME工作流 with open('edi_parse_result.json', 'w', encoding='utf-8') as out_f: json.dump(edi_parse_result, out_f, ensure_ascii=False, indent=2) print("EDIFACT解析完成,结果已存入edi_parse_result.json")
KNIME对接说明
拿到解析后的JSON结果后,可选择两种方式传入KNIME工作流:
- 直接用KNIME的File Reader节点读取上面代码生成的
edi_parse_result.json本地文件,后续接JSON处理节点做数据转换即可。 - 如果不想落地本地文件,可以把Python脚本封装为KNIME的Python Script节点,直接把解析得到的JSON字典转成KNIME支持的表结构数据流,在工作流内部直接传递,不用做文件中转。
注意:如果修正后仍然请求失败,可以先打印
r.text查看接口返回的具体错误提示,常见问题包括订阅密钥失效、EDI文件格式不符合规范、接口调用配额耗尽等。
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

