我正在玩plug router并尝试在我的路由器中读取简单发布请求的正文:
表格
<form action="/create_item" method="post">
<input type="text" value="whatever" name="name">
<input type="number" value="99" name="age">
<input type="submit">
</form>
我的路由器
post("/create_item") do
{:ok, data, _conn} = read_body(conn)
send_resp(conn, 200, data)
end
如果我提交表单,这会将name=input-value
呈现给页面,但是我必须解析该字符串才能获取值。这有点冒犯它的错误方法。
根据我对elixir的小经验,似乎我应该在read_body(conn)
上执行类似模式匹配的操作,从我的表单中提取每个key: value
,但我找不到任何相关信息。 plug docs。我试图通过凤凰源寻找想法,但这有点超出了我的灵丹妙药的知识。我缺少一个明显的parse_form_data/1
函数吗?
答案 0 :(得分:9)
Plug.Conn.read_body/1
只是读取请求的主体,而不解析它。要解析正文,通常需要使用Plug.Parsers
插件,该插件根据内容类型读取和解析请求正文。
例如,如果您按这样插入:
plug Plug.Parsers, parsers: [:urlencoded]
在管道中的任何地方都会有conn.params
可用。
答案 1 :(得分:0)
conn = parse(conn)
name = conn.params["name"]
age = conn.params["age"]
def parse(conn, opts \\ []) do
opts = Keyword.put_new(opts, :parsers, [Plug.Parsers.URLENCODED, Plug.Parsers.MULTIPART])
Plug.Parsers.call(conn, Plug.Parsers.init(opts))
end
答案 2 :(得分:0)
最近我遇到了这个问题。这就是我使用的方式:
{:ok, body, conn} = Plug.Conn.read_body(conn)
parsed_body = Poison.Parser.parse!(body)
IO.puts "The body is #{parsed_body}, #{inspect is_map(parsed_body))"
我想也许是另一种解决方法,所以现在我正在阅读Plug module doc。