elixir plug:从发布请求中获取表单数据的正确方法

时间:2015-12-27 01:47:15

标签: elixir

我正在玩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函数吗?

3 个答案:

答案 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。