Разбор json-части многочастного / смешанного запроса в Elixir/Phoenix
Я пишу бэкэнд API Jlix 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.
1 ответ
Синтаксический анализатор Plug, похоже, работает должным образом. Анализатор Plug JSON, очевидно, работает только для запросов с типом содержимого application/json
или же application/*+json
см. исходный код. Я предполагаю, что парсеры смотрят на тип содержимого всего запроса и не знают частей составного запроса.
Насколько я могу судить, самое простое на данный момент решение - проанализировать контент самостоятельно. Я могу видеть, как вы ожидали, что это будет работать, хотя, возможно, стоит запросить эту функцию через проблему Github.