Django调用Basecamp 3 API上传图片至评论报422错误求助
解决Basecamp 3待办事项带预览图片评论的422错误问题
核心问题分析
你的问题出在评论API的请求格式和<bc-attachment>标签的使用逻辑上:
- 用
application/json提交时,Basecamp无法正确解析附件标签,导致图片仅能完成上传但无法生成预览; - 422错误大概率是请求参数缺失、
attachable_sgid无效,或是请求头/格式不符合Basecamp的要求。
具体解决步骤
1. 确保附件上传流程完全合规
上传图片到Attachments API时,必须严格使用multipart/form-data格式,参数需匹配官方要求:
import requests # 假设已通过OAuth2获取有效access_token,basecamp_domain为你的实例域名 upload_url = f"https://{basecamp_domain}/3/{account_id}/attachments.json" headers = {"Authorization": f"Bearer {access_token}"} # 读取本地保存的用户上传图片 with open(local_image_path, "rb") as img_file: files = { "file": img_file, "name": "comment_image.jpg" # 文件名需匹配图片实际格式 } response = requests.post(upload_url, headers=headers, files=files) # 验证上传结果,获取有效attachable_sgid if response.status_code == 201: attachable_sgid = response.json()["attachable_sgid"] else: # 打印错误详情排查上传环节问题 print(response.json())
注意:attachable_sgid为一次性有效且有时间限制,需在获取后立即用于评论请求。
2. 调用评论API的正确格式
评论API必须使用application/x-www-form-urlencoded格式提交,不能用application/json,且content字段要正确嵌入附件标签:
comment_url = f"https://{basecamp_domain}/3/{account_id}/buckets/{bucket_id}/recordings/{todo_id}/comments.json" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/x-www-form-urlencoded" } # 构建带附件标签的评论内容,标签需严格闭合,sgid替换为上传后获取的值 comment_content = f"这是带图片的评论 <bc-attachment sgid=\"{attachable_sgid}\"></bc-attachment>" # 表单格式的请求参数,content为必填项 data = { "content": comment_content } response = requests.post(comment_url, headers=headers, data=data) # 排查422错误:打印返回的具体错误信息 if response.status_code == 422: print("错误详情:", response.json()) elif response.status_code == 201: print("评论提交成功")
3. 422错误的常见排查点
如果仍出现422错误,优先检查以下内容:
attachable_sgid有效性:确认附件上传请求返回201,且sgid未过期;- 必填参数完整性:评论API需确保
bucket_id、待办事项ID(即record_id)、content参数全部正确; - 标签格式正确性:
<bc-attachment>标签必须用双引号包裹sgid,且标签需闭合; - 权限验证:OAuth2令牌需拥有
write权限,确保能操作目标待办事项。
4. 图片预览验证
提交成功后,Basecamp会自动解析<bc-attachment>标签生成带预览的图片评论。如果仍显示空白,检查上传的图片是否损坏,或格式是否为Basecamp支持的类型(如JPG、PNG等)。
内容的提问来源于stack exchange,提问作者Vidian
相关产品推荐
相关产品推荐

