我如何获得凤凰的请求体?

Uri*_*ssi 4 erlang elixir phoenix-framework

我正在尝试构建一个凤凰应用程序,我处理一个POST请求.我想得到请求体,我似乎无法找到任何关于如何做的文档.

做一些逆向工程我得到了以下代码:

defmodule MyApp.Controllers.Pages do
  use Phoenix.Controller

  def post(conn) do
    {_, {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, body, _, _, _, _, _, _}} = conn.adapter
    text conn, "#{inspect body}"
  end
end
Run Code Online (Sandbox Code Playgroud)

与路由:

defmodule MyApp.Router do
  use Phoenix.Router

  post "/test", MyApp.Controllers.Pages, :post
end
Run Code Online (Sandbox Code Playgroud)

必须有更好的方法,不是吗?

预期行为:

curl -XPOST localhost:4000/test -d 'this is a test'
$ "this is a test"
Run Code Online (Sandbox Code Playgroud)

小智 6

我使用凤凰版0.6.1,我无法使上述方法工作.我发现以下工作:

defmodule MyApp.MyController do
  use Phoenix.Controller

  plug :action 

  def login(conn, _params) do
    {:ok, data, _conn_details} = Plug.Conn.read_body(conn)

    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

请求正文以数据形式返回.不确定这是否是获取请求正文的"官方"方式,但我想我会分享它.


Uri*_*ssi 0

我在elixir-lang的测试中发现了这一点:

defmodule MyApp.Controllers.Pages do
  use Phoenix.Controller

  def post(conn) do
    body = read_req_body(conn)
    text conn, "#{inspect body}"
  end

  defp read_req_body({:ok, buffer, state}, acc, adapter) do
    read_req_body(adapter.stream_req_body(state, 100_000), acc <> buffer, adapter)
  end

  defp read_req_body({:done, state}, acc, _adapter) do
    {acc, state}
  end

  defp read_req_body(%{adapter: {adapter, state}}) do
    {body, _} = read_req_body({:ok, "", state}, "", adapter)
    body
  end
end
Run Code Online (Sandbox Code Playgroud)