我正在尝试使用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。
我做错了什么?
答案 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