Разбор 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.

Другие вопросы по тегам