如何用Python Requests向Dependency-Track API上传SBOM文件?
解决Dependency-Track SBOM上传500内部服务器错误问题
问题根源
你的Python代码手动指定了Content-Type: multipart/form-data,但requests库处理多部分表单数据时,会自动生成包含正确boundary的Content-Type头。手动设置该头会导致服务器无法正确解析请求体,进而触发500错误。此外,最初的写法将文件字段混入data参数,不符合requests的多部分表单提交规范。
修正后的代码
from pathlib import Path import requests def upload_bom(file_path, project_uuid, project_version): url = "https://dtrack.example.com/api/v1/bom" headers = { "Accept": "application/json", "X-Api-Key": "my_token" # 移除手动设置的Content-Type,让requests自动生成 } # 表单文本字段放在data参数中 data = { "project": project_uuid, "projectVersion": project_version } # 文件字段单独放在files参数中,同时传递文件名(与curl行为保持一致) file_name = Path(file_path).name with open(file_path, "rb") as bom_file: files = {"bom": (file_name, bom_file)} response = requests.post(url, headers=headers, data=data, files=files) return [response.status_code, response.content]
关键改动说明
- 移除手动Content-Type头:requests检测到
files参数时,会自动生成带正确boundary的multipart/form-data头,这是服务器能正确解析请求的核心前提。 - 分离data和files参数:表单文本字段(project、projectVersion)放入
data,文件字段放入files,完全遵循HTTP多部分表单提交规范。 - 保留文件名:通过
(file_name, bom_file)格式传递文件,和curl中@alpine.json的行为一致,确保服务器能识别SBOM文件类型(部分场景下服务器依赖文件名后缀判断格式)。
内容的提问来源于stack exchange,提问作者Vasai
相关产品推荐
相关产品推荐

