无法使用带有Elixir的Plug.Parsers解码Json

时间:2018-03-29 00:08:06

标签: elixir

我正在尝试使用Elixir和Plug构建一个端点,该端点应该从Github接收Json,但由于我不明白body_params总是空的:

defmodule Endpoint do
  import Plug.Conn

  require Logger

  use Plug.Builder

  plug Plug.Parsers, parsers: [:json], json_decoder: Jason

  def init(options), do: options

  def call(conn, _opts) do
    Logger.debug inspect(conn)
    conn
      |> put_resp_content_type("text/plain")
      |> send_resp(200, "Welcome Github!\n")
  end
end

我对Plug.Parsers文档的理解是它应该获取并解码Json主体,我应该在body_params下有一个数据结构,但很明显我错过了一些东西。 如果我

{:ok, body, conn} = Plug.Conn.read_body(conn)

body包含Json。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您必须使用super方法来调用您列出的插件链Plug.Parsers

此外,请使用conn.body_params代替Plug.Conn.read_body,因为 Plug.Parsers will read the body因此访问后正文无法使用。

在处理完毕后,Plug.Parsers:body_params set to the map of params parsed by parsers,这是合并:body_params:query_params的结果。

defmodule TestPlug do
  import Plug.Conn
  require Logger

  use Plug.Builder

  plug Plug.Parsers, parsers: [:json], json_decoder: Jason

  def init(options), do: options

  def call(conn, opts) do
    conn =  super(conn, [])
    IO.inspect conn.body_params
    conn
      |> put_resp_content_type("text/plain")
      |> send_resp(200, "Welcome Github!\n")
  end
end
  

Plug.Builder提供的call / 2函数在内部使用   执行使用插件宏列出的所有插件,因此覆盖   call / 2函数一般意味着使用super才能仍然调用   插件链2