Erlang 我怎样才能在凤凰城得到尸体?
我正在尝试构建一个phoenix应用程序,并处理一个POST请求。我想得到请求主体,但我似乎找不到任何关于如何做的文档 在进行逆向工程时,我得到了以下代码:Erlang 我怎样才能在凤凰城得到尸体?,erlang,elixir,phoenix-framework,Erlang,Elixir,Phoenix Framework,我正在尝试构建一个phoenix应用程序,并处理一个POST请求。我想得到请求主体,但我似乎找不到任何关于如何做的文档 在进行逆向工程时,我得到了以下代码: defmodule MyApp.Controllers.Pages do use Phoenix.Controller def post(conn) do {_, {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, body, _, _, _, _
defmodule MyApp.Controllers.Pages do
use Phoenix.Controller
def post(conn) do
{_, {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, body, _, _, _, _, _, _}} = conn.adapter
text conn, "#{inspect body}"
end
end
使用路由:
defmodule MyApp.Router do
use Phoenix.Router
post "/test", MyApp.Controllers.Pages, :post
end
一定有更好的办法,不是吗
预期行为:
curl -XPOST localhost:4000/test -d 'this is a test'
$ "this is a test"
我在中的测试中发现了这一点:
defmodule MyApp.Controllers.Pages
使用菲尼克斯控制器
def post(conn)do
主体=读要求主体(连接)
文本连接“#{inspect body}”
结束
defp read_req_body({:ok,buffer,state},acc,adapter)do
读请求正文(适配器.流请求正文(状态,100,000),acc缓冲区,适配器)
结束
defp read_req_body({:done,state},acc,_adapter)do
{acc,state}
结束
defp read_req_body(%{adapter:{adapter,state}})do
{body,{}=read_req_body({:ok,“,state},”,adapter)
身体
结束
结束
我刚刚推出了Phoenix 0.2.5,它能够轻松访问请求正文。Plug 4.4刚刚发布,以支持收集正文(conn,”)
。此函数是在Phoenix控制器的上下文中导入的,因此您应该能够使用collect\u body(conn,“”)
将整个body作为字符串获取。请尝试一下,如果您无法让它工作,请打开一个Github问题
我使用的是Phoenix版本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
请求主体以数据形式返回。不确定这是否是获取请求正文的“官方”方式,但我想我会分享它。您需要使用
读取正文
功能
此函数读取请求正文的一个块,最大为给定的:长度。
如果有更多的数据要读取,那么{:more,partial_body,conn}是
返回。否则返回{:ok,body,conn}。万一发生错误
读取套接字时,{:error,reason}按照返回
:gen_tcp.recv/2
不幸的是,我无法测试Phoenix 0.2.5,因为我的项目使用的是健忘症,它与elixir 0.14.0不同。。。
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