Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 我怎样才能在凤凰城得到尸体?_Erlang_Elixir_Phoenix Framework - Fatal编程技术网

Erlang 我怎样才能在凤凰城得到尸体?

Erlang 我怎样才能在凤凰城得到尸体?,erlang,elixir,phoenix-framework,Erlang,Elixir,Phoenix Framework,我正在尝试构建一个phoenix应用程序,并处理一个POST请求。我想得到请求主体,但我似乎找不到任何关于如何做的文档 在进行逆向工程时,我得到了以下代码: defmodule MyApp.Controllers.Pages do use Phoenix.Controller def post(conn) do {_, {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, body, _, _, _, _

我正在尝试构建一个phoenix应用程序,并处理一个POST请求。我想得到请求主体,但我似乎找不到任何关于如何做的文档

在进行逆向工程时,我得到了以下代码:

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