Разбор json-части многочастного / смешанного запроса в Elixir / Phoenix - PullRequest
0 голосов
/ 28 июня 2018

Я пишу бэкэнд 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.

1 Ответ

0 голосов
/ 29 июня 2018

Кажется, что синтаксический анализатор Plug multipart работает должным образом. Анализатор Plug JSON, по-видимому, работает только для запросов с типом содержимого application/json или application/*+json, см. исходный код . Я предполагаю, что парсеры смотрят на тип содержимого всего запроса и не знают о частях составного запроса.

Насколько я понимаю, самым простым на данный момент решением было бы проанализировать содержимое самостоятельно. Я могу видеть, как вы ожидали, что это будет работать, хотя, возможно, стоит запросить эту функцию через проблему Github.

...