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
由包装函数处理,该函数向请求添加一些样板错误检查和速率限制,以及在请求失败时更详细的错误转储,但我已经确认(在上面的例子中)同样的错误在没有包装器的情况下仍然存在。
我试过的调整
- 将
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"
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
修改每个请求的内容类型。
我正在尝试使用 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
由包装函数处理,该函数向请求添加一些样板错误检查和速率限制,以及在请求失败时更详细的错误转储,但我已经确认(在上面的例子中)同样的错误在没有包装器的情况下仍然存在。
我试过的调整
- 将
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"
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
修改每个请求的内容类型。