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)
请求正文以数据形式返回.不确定这是否是获取请求正文的"官方"方式,但我想我会分享它.
我在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)