我正在尝试使用python-requests
将PDF作为Trello卡的附件上传。尽管进行了重大调整,但我无法在下面的函数中获取返回400: Error parsing body
以外的任何内容的请求(详细信息如下)。
我应该注意,我能够创建卡片并向其中添加URL附件(都不要求上传文件)。
以下是处理文件POST的代码:
def post_pdf(session, design, card_id):
attachment = {
"name": design["campaign_title"] + " - Combined PDF",
"mimeType": "application/pdf"
}
pdf_post = session.post(
url = "https://api.trello.com/1/cards/" + card_id + "/attachments",
files = {"file": open("combined_pdf.pdf", "rb")},
data = attachment
)
身份验证密钥和令牌是在创建会话时设置的会话参数,因此不在此处添加。
此外,在实际代码中,POST
由包装函数处理,该包装函数为请求添加了一些样板错误检查和速率限制,以及在请求失败时进行更详细的错误转储,但是我已经确认(在上面的示例中)没有包装程序,同样的错误仍然存在。
我尝试过的调整
data = attachment
代替json = attachment
data = attachment
代替params = attachment
attachment
并POST
删除没有关联数据的文件stream = True
(对于上传似乎无关紧要,但是我认为尝试使用它不会感到受伤)base64
(此编码在其他地方是必需的;我正忙于吸管)base64
,并结合上述对data
/ json
/ params
的调整 注意:PDF文件可能是问题的根源-它是通过将多个图像转换为PDF格式,然后将它们与pdfunite
连接而生成的,所以我很可能会犯错在创建过程中导致Trello拒绝文件。似乎可以确认的是,对Trello "Error parsing body"
进行谷歌搜索会返回两个匹配,其中只有一个与Trello有关,而没有一个有用。这使我认为这是一条特别奇怪/罕见的错误消息,对我来说意味着我对文件进行了某种严重的错误编码。
但是,PDF文件在我(和我的同事)系统上正确打开,没有任何错误消息,工件或其他奇怪行为。更重要的是,使用其他“已知良好”的PDF尝试执行此操作也将失败,并带有相同的错误代码。因为文件的内容在“公司财产/信息”的范围之内,所以我希望避免发布它(和/或原始请求正文),但是如果达成共识,它将引起问题,我会这样做。
答案 0 :(得分:0)
我找到了解决方案:Content-Type
标头设置错误,因为在发送上载请求时,会话范围的设置(Session.headers.update({"Content-Type": "application/json"})
)覆盖了multipart/form-data
标头。这导致Trello拒绝了尸体。我通过删除会话级标头解决了问题,该标头允许requests
修改每个请求的内容类型。