API Trello — 400: ошибка синтаксического анализа тела при отправке вложенного файла, состоящего из нескольких частей.

Я пытаюсь загрузить PDF-файл в виде вложения на карточку Trello, используя python-requests. Мне не удалось получить запрос в функции ниже, чтобы вернуть что-либо, кроме 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 чтобы отклонить файл. Кажется, это подтверждается тем, что поиск в Google по запросу Trello "Error parsing body" возвращает два результата, только один из которых касается Trello, и ни один из них не является полезным. Это наводит меня на мысль, что это особенно странное/редкое сообщение об ошибке, которое для меня означает, что я допустил какую-то серьезную ошибку при кодировании файла.

Однако файл PDF правильно открывается в моей системе (и в системе моих коллег) без каких-либо сообщений об ошибках, артефактов или других странных действий. Что еще более важно, попытка сделать это с другими «заведомо исправными» PDF-файлами также не увенчается успехом с тем же кодом ошибки. Поскольку содержимое файла не выходит за рамки «собственности/информации компании», я бы не хотел публиковать его (и/или необработанный текст запроса), но я сделаю это, если есть согласие, что это вызывает проблему.


person ModelHX    schedule 19.07.2018    source источник


Ответы (1)


Я нашел решение: заголовок Content-Type был установлен неправильно из-за настройки всего сеанса ( Session.headers.update({"Content-Type": "application/json"}) ), переопределяющей заголовок multipart/form-data при отправке запроса на загрузку. Это заставило Trello отказаться от тела. Я решил проблему, удалив заголовок уровня сеанса, который позволял requests изменять тип контента для каждого запроса.

person ModelHX    schedule 30.07.2018