Trello API - 400:"Error parsing body" 发布多部分文件附件时

Trello API - 400: "Error parsing body" when POSTing a multipart file attachment

我正在尝试使用 python-requests 将 PDF 作为附件上传到 Trello 卡片。尽管进行了重大调整(详见下文),但我一直无法在下面的函数中获得 return 除 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 由包装函数处理,该函数向请求添加一些样板错误检查和速率限制,以及在请求失败时更详细的错误转储,但我已经确认(在上面的例子中)同样的错误在没有包装器的情况下仍然存在。


我试过的调整


注意: PDF 文件可能是问题的根源 - 它是通过将多个图像转换为 PDF 格式然后将它们与 pdfunite 连接而生成的,所以我很可能在创建过程中犯了错误,导致 Trello 拒绝该文件。似乎证实这一点的是谷歌搜索 Trello "Error parsing body" return 的两次点击,其中只有一次与 Trello 有关,而且都没有用。这让我认为这是一个特别奇怪/罕见的错误消息,这对我来说意味着我在编码文件时犯了某种严重的错误。

但是,PDF 文件在我(和我的同事)的系统上可以正常打开,没有任何错误消息、伪像或其他奇怪的行为。更重要的是,用其他 "known good" PDF 尝试此操作也会失败,并显示相同的错误代码。因为文件的内容在 "company property / information" 的范围内,所以我想避免发布它(和/或原始请求正文),但如果一致认为它导致了问题,我会这样做。

我找到了解决方案:由于 session-wide 设置 ( Session.headers.update({"Content-Type": "application/json"}) ) 覆盖了 multipart/form-data [=19],Content-Type header 设置不正确=] 发送上传请求时。这导致 Trello 拒绝 body。我通过删除 session-level header 解决了这个问题,这允许 requests 修改每个请求的内容类型。