Asana REST API — прикрепить файл к задаче

Я пытаюсь прикрепить файл к задаче в Asana через REST API и получаю ошибку тайм-аута. Я считаю, что ошибка исходит от Асаны, поэтому я как бы застрял...

Запрос, который я делаю, имеет следующий формат

POST https://app.asana.com/api/1.0/tasks/<my task>/attachments HTTP/1.1
User-Agent: OutSystemsPlatform
Content-Type: multipart/form-data; boundary="<my boundary>"
Authorization: Bearer <my bearer>
Host: app.asana.com
Content-Length: 218

--<my boundary>
content-disposition:  multipart/form-data; name=file; filename=<my filename>;
content-type: image/jpeg
<file binary data>
--<my boundary>--

Ответ, который я получаю, следующий

HTTP/1.1 504 Gateway Time-out
Connection: keep-alive
Content-Length: 176
Content-Type: text/html
Date: Tue, 28 Apr 2015 11:36:03 GMT
Server: nginx

<html>
<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>

Мне кажется, что запрос хорошо отформатирован, но он не работает.

Кто-нибудь может помочь?

Спасибо, Педро Кардосо.


person Pedro Cardoso    schedule 28.04.2015    source источник
comment
В настоящее время я изучаю сценарии, в которых мы генерируем этот 504. Я подозреваю, что запрос на самом деле немного отличается, и у нас возникают проблемы с его разбором, но я не уверен, что именно не так. На каком языке вы пытаетесь это сделать? Используете ли вы какие-либо библиотеки для построения запроса?   -  person Andrew Noonan    schedule 28.04.2015
comment
Я использую платформу OutSystems. Если вы этого не знаете, просто посетите www.outsystems.com. По сути, это создает приложение .Net, которое запускает эти запросы. Запрос, который я вставил сюда, это то, что я вижу в журналах. Почему вы говорите, что запрос немного не тот?   -  person Pedro Cardoso    schedule 29.04.2015
comment
Можете ли вы проверить, какие разрывы строк вы используете в своем запросе? Как вы можете прочитать здесь. Спецификация HTTP должна использовать \r\n для разрывов строк. Наш сервер будет генерировать 5xx в случае запроса multipart/form-data, который неправильно сформирован с помощью \n.   -  person Andrew Noonan    schedule 30.04.2015


Ответы (1)


Отличный вопрос! К сожалению, загрузка multipart/form-data склонна к генерации 5xx из-за ошибок, возникающих во время анализа данных, происходящих на сервере.

Мы работаем над тем, чтобы ужесточить это и вернуть 4xx, где это возможно.

Я подозреваю, что вы получаете эту ошибку из-за неправильного завершения линии.

Сделанные запросы должны соответствовать спецификации HTTP/1.1, согласно которой разделители строк имеют форму CRLF или \r\n, обозначенную здесь, чтобы сервер мог надежно и правильно обработать запрос.

person Andrew Noonan    schedule 01.05.2015
comment
Насколько я вижу, запрос имеет правильные символы. Вот ссылка на скриншот трассировки в Notepad++ со всеми видимыми символами. - person Pedro Cardoso; 04.05.2015
comment
В своем исходном сообщении вы правильно включили свою уникальную границу, заголовки Content-Disposition и Content-Type в тело сообщения, однако я не вижу их на скриншоте. Также убедитесь, что перед и сразу после фактических данных файла есть пустая строка. - person Andrew Noonan; 05.05.2015
comment
Спасибо за обновления. Вы его не видите, потому что тело запроса двоичное... Вот скриншот для часть кода, где я это делаю... - person Pedro Cardoso; 10.05.2015
comment
Это проблема. Не преобразовывайте эти данные в двоичные. Цель заголовков границы и части MIME — указать серверу, какой будет кодировка данных. Двоичное кодирование не позволяет серверу считывать заголовки. Также не конвертируйте данные файла после того, как вы прочитали его с диска. Просто укажите тип содержимого, новую строку и необработанные данные файла. После того, как вы подтвердите это, пожалуйста, прокомментируйте здесь, и я обновлю вопрос и ответ, чтобы точно отразить сценарий здесь. - person Andrew Noonan; 11.05.2015