私は Elixir/Phoenix json API バックエンドを書いていますが、エンドポイントが複数の画像ファイルと json 形式の属性を 1 つのリクエストで受け取るようにしたいと考えています。そのためにコンテンツ タイプを使用して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: How to parse multipart form with JSON field #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 を使用しています。