Публикация chunked Multipart / form-data с использованием cfhttp с другим типом контента - PullRequest
2 голосов
/ 25 января 2020

Совсем недавно я работал со сторонним REST API, к которому я должен был поместить POST-часть / данные формы, состоящую из двух частей - одна с объектом json, а другая с BLOB-файлом PDF. Формат тела был таким, как показано ниже:

--boundary
Content-Type: application/vnd.xx+json; charset=utf-8
Content-Disposition: form-data; name=data

{JSON-OBJECT}
--boundary
Content-Type: application/bin
Content-Disposition: form-data; name=bin; filename=Doc2.pdf; filename*=utf-8''Doc2.pdf 

***PDF-BLOB***
--boundary--

Я искал несколько дней, но не смог найти способ сделать этот вызов с помощью Coldfusion. В конце концов я успешно реализовал то, что было предложено здесь: https://www.bennadel.com/blog/2252-apparently-coldfusion-cannot-handle-chunked-multi-part-form-data.htm

Однако мне остается задуматься о следующем:

  • Учитывая, что вышеупомянутый пост является относительно старым (~ 2011), это все еще верно сегодня?
  • Разве это не может быть сделано путем использования тега CFHTTP для создания многочастной формы, состоящей из двух частей, каждая из которых имеет уникальный тип содержимого и расположение содержимого?

Только для записей, вот что я пробовал, но не очень успешно. Также хочу отметить, что для меня не имеет смысла интуитивно устанавливать несколько Content-Type / Disposition в одном блоке кода cfhttp, или, по крайней мере, я не совсем понимаю, как это будет сопоставлено в одном запросе multipart / form-data. Однако, когда я играл с кодом, я старался изо всех сил, чтобы он работал.

<cfhttp url="#url#" method="POST" username="#userName#" password="#password#" multipart="true">
    <cfhttpparam type="header" name="Accept" value="*/*">
    <cfhttpparam type="header" name="Content-Type" value="application/vnd.xx+json; charset=utf-8">
    <cfhttpparam type="header" name="Content-Disposition" value="form-data; name=data">
    <cfhttpparam type="formfield" name="data" value="#body#">
    <cfhttpparam type="header" name="Content-Type" value="application/bin">
    <cfhttpparam type="header" name="Content-Disposition" value="form-data; name=bin; filename=#filename#; filename*=utf-8''#filename#">
    <cfhttpparam type="file" name="bin" file="#session.target#">
</cfhttp>
...