Я пишу бэкэнд API elixir / Phoenix json и хотел бы, чтобы конечная точка получала несколько файлов изображений вместе с некоторыми атрибутами в формате json в одном запросе. Для этого я использую тип контента multipart/mixed
, и вот как выглядит мой запрос cURL.
curl -4 -H "Content-Type: multipart/mixed" \
-H "Authorization: FNRM8ISXiUujh+I2X" \
-F "meta={"registration": "face"}; type=application/json" \
-F "captures[]=@r1.jpg; type=image/jpg" \
-F "captures[]=@r2.jpg; type=image/jpg" \
-X POST http://localhost:4000/api/bioid/register -i -v
В моем действии контроллера я получаю аккуратно проанализированные файлы, но моя часть json остается непарсированной.
pry(2)> params
%{
"captures" => [
%Plug.Upload{
content_type: "image/jpg",
filename: "r1.jpg",
path: "/var/folders/v7/qlf90zb13szch162hvx6d1s00000gn/T//plug-1530/multipart-1530206341-21611204340048-7"
},
%Plug.Upload{
content_type: "image/jpg",
filename: "r2.jpg",
path: "/var/folders/v7/qlf90zb13szch162hvx6d1s00000gn/T//plug-1530/multipart-1530206341-700143184604965-7"
}
],
"meta" => "{registration: face}; type=application/json"
}
Вот обсуждение, которое представляется актуальным, WIP: Как проанализировать многочастную форму с полем JSON # 570 . Очевидно, что разбор частей application/json
не должен происходить автоматически. Вместо этого последнее сообщение предлагает использовать специальный считыватель тела для выполнения дополнительного анализа.
Является ли эта интерпретация правильной или есть другой способ обработки полезной нагрузки multipart/mixed
, чтобы любые параметры из application/json
частей были доступны в уже проанализированном действии контроллера?
Дополнительный вопрос
Что меня смущает, так это то, что вышеописанный синтаксический анализ выполняется, мне даже не нужно использовать Plug.Parsers
. Из того, что я прочитал, для получения анализируемой многочастной полезной нагрузки необходимо следующее.
plug Plug.Parsers,
parsers: [:urlencoded, :multipart, :json],
json_decoder: Poison
Я получаю одинаковые результаты, независимо от того, присутствует этот плагин в конвейере или нет. Это, вероятно, там по умолчанию, но я хотел бы подтвердить это.
Я использую Elixir 1.6.5, Phoenix 1.3.2 и Plug 1.6.0.