您可以将自定义:body_reader
选项传递Plug.Parsers
给以缓存正文以供以后使用。
您不希望在解析器之前读取正文,而是缓存正文以便稍后从您想要散列它的插件中读取。
:body_reader
- 一个可选的替换(或包装器),
Plug.Conn.read_body/2
用于提供一个函数,在解析和丢弃之前访问原始主体。它采用{Module, :function, [args]}
(MFA) 的标准格式,默认为
{Plug.Conn, :read_body, []}
.
有时您可能想要自定义解析器如何从连接中读取正文。例如,您可能希望缓存正文以稍后执行验证,例如 HTTP 签名验证。这可以通过自定义正文阅读器来实现,该阅读器将读取正文并将其存储在连接中,例如:
defmodule CacheBodyReader do
def read_body(conn, opts) do
{:ok, body, conn} = Plug.Conn.read_body(conn, opts)
conn = update_in(conn.assigns[:raw_body], &[body | (&1 || [])])
{:ok, body, conn}
end
end
然后可以将其设置为:
plug Plug.Parsers,
parsers: [:urlencoded, :json],
pass: ["text/*"],
body_reader: {CacheBodyReader, :read_body, []},
json_decoder: Jason
它是在Plug v1.5.1中添加的。