【问题标题】:Trello API - 400: "Error parsing body" when POSTing a multipart file attachmentTrello API - 400:发布多部分文件附件时出现“解析正文错误”
【发布时间】:2018-12-27 18:59:00
【问题描述】:

我正在尝试使用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
  • 完全省略 attachmentPOSTing 没有关联数据的文件
  • stream = True 添加到请求参数(这对于上传似乎无关紧要,但我认为尝试不会有什么坏处)
  • 将文件编码为 base64(此编码已在其他地方需要;我正抓紧救命稻草)
  • 将文件编码为base64,结合上述调整为data/json/params

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

但是,PDF 文件在我(和我同事的)系统上正常打开,没有任何错误消息、伪影或其他奇怪行为。更重要的是,尝试使用其他“已知良好”的 PDF 也会失败,错误代码相同。因为文件的内容属于“公司财产/信息”的范围,我想避免发布它(和/或原始请求正文),但如果同意它导致问题,我会这样做。

【问题讨论】:

    标签: python python-requests trello


    【解决方案1】:

    我找到了解决方案:发送上传请求时,由于会话范围的设置 (Session.headers.update({"Content-Type": "application/json"})) 覆盖了 multipart/form-data 标头,Content-Type 标头设置不正确。这导致 Trello 拒绝了正文。我通过删除会话级标头解决了这个问题,它允许requests 修改每个请求的内容类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-14
      • 2018-03-29
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2019-06-28
      • 2015-09-17
      • 1970-01-01
      相关资源
      最近更新 更多