使用Buzzsprout API上传播客时持续出现422错误求助
解决Buzzsprout API创建剧集时的422错误
422状态码表示请求语义合法,但服务器无法处理请求中的实体内容,结合你的代码和Buzzsprout API规则,问题出在以下几个关键细节:
问题分析
- 请求头冲突:你手动设置了
application/json类型的Content-Type,但使用files参数上传文件时,requests会自动生成multipart/form-data格式的请求头,手动指定的json头会导致API无法正确解析请求体。 - 参数结构错误:Buzzsprout API要求所有剧集相关参数必须嵌套在
episode键下,你直接传递顶级键值对,不符合API的参数格式要求。 - 文件参数不规范:上传音频文件时,未明确指定文件名和MIME类型,可能导致服务器无法识别文件格式。
修正后的代码
import requests url = "https://www.buzzsprout.com/api/******/episodes.json" headers = { "Authorization": "Token token=********" # 移除手动设置的Content-Type,让requests自动处理 } audio_file_path = "*************************" # 打开文件并构建规范的files参数 with open(audio_file_path, "rb") as f: # 提取文件名,指定MIME类型(以MP3为例) file_name = audio_file_path.split("/")[-1] files = { "episode[audio_file]": (file_name, f, "audio/mpeg") } # 所有参数嵌套在episode键下,符合API格式要求 data = { "episode[title]": "Too many or too few?", "episode[description]": "", "episode[explicit]": False, "episode[private]": True, "episode[email_user_after_audio_processed]": True, } response = requests.post(url, headers=headers, data=data, files=files) if response.status_code == 200: print("Episode created successfully.") else: print("Failed to create episode. Status code:", response.status_code) with open('error.txt', 'w') as f: f.write(response.content.decode('utf-8'))
关键修改说明
- 移除
headers中的Content-Type配置,让requests根据files参数自动生成正确的multipart/form-data请求头。 - 将所有剧集参数改为
episode[xxx]的格式,匹配API要求的嵌套结构。 - 修改
files参数的键为episode[audio_file],同时指定文件名和音频MIME类型(如audio/mpeg对应MP3文件),确保服务器能正确识别上传内容。
内容的提问来源于stack exchange,提问作者Shazbot
相关产品推荐
相关产品推荐

