【问题标题】:Can't decode Json using Plug.Parsers with Elixir无法使用带有 Elixir 的 Plug.Parsers 解码 Json
【发布时间】:2018-03-29 13:00:57
【问题描述】:

我正在尝试使用 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。

我做错了什么?

【问题讨论】:

    标签: elixir


    【解决方案1】:

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

    此外,请使用conn.body_params 而不是Plug.Conn.read_body,因为 Plug.Parserswill read the body所以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 函数在内部用于 使用 plug 宏执行所有列出的插件,因此覆盖 call/2 函数通常意味着使用 super 以便仍然调用 插件链2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2020-05-20
      • 2018-05-13
      相关资源
      最近更新 更多