【问题标题】:Parsing a json part of a multipart/mixed request in Elixir/Phoenix在 Elixir/Phoenix 中解析多部分/混合请求的 json 部分
【发布时间】:2018-06-28 17:44:44
【问题描述】:

我正在编写一个 Elixir/Phoenix json API 后端,并且希望端点能够在单个请求中接收多个图像文件以及一些 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: How to parse multipart form with JSON field #570。很明显,application/json 部分的解析不应期望自动发生。相反,last message 建议使用a custom body reader 来执行任何额外的解析。

这种解释是否正确,或者是否有其他方法来处理 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。

【问题讨论】:

    标签: elixir phoenix-framework plug


    【解决方案1】:

    Plug 多部分解析器似乎按预期工作。 Plug JSON 解析器显然只适用于内容类型为application/jsonapplication/*+json 的请求,请参阅source code。我假设解析器正在查看整个请求的内容类型并且不知道多部分请求部分。

    据我所知,目前最简单的解决方案是自己解析内容。我可以看到您希望它如何工作,并且可能值得通过 Github 问题请求此功能。

    【讨论】:

    • 有道理。尽管我发现解析器确实在 image/jpg 部分内部并正确解析它们,而同一级别的 application/json 部分保持不变,这有点不一致。我会考虑申请一项功能。
    • Plug 只是针对多部分正文具有属性“文件名”的情况实施了特殊处理。 AFAICS Plug 只实现了多部分规范的一个常用子集,特别是它似乎没有递归地应用解析器。原则上,甚至应该可以嵌套多部分主体,但我很确定 Plug 也不会处理这种情况。
    猜你喜欢
    • 2016-11-08
    • 2021-12-24
    • 1970-01-01
    • 2016-01-29
    • 2011-04-11
    • 2011-11-10
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多