在 Phoenix 中获取原始 HTTP 请求正文

Getting raw HTTP request body in Phoenix

我已经按照 this issue 从我的控制器中的 POST 获取原始正文,但仅当编码设置为 application/x-www-form-urlencoded 时才会显示正文。当我使用 curl 进行测试时,我可以读取 POST 正文,但当编码设置为 text/xml 时,正文显示为空。在我的 router.ex 中,我有:

pipeline :api do
  plug :accepts, ["xml"]
end

在我的控制器中我有:

def parse(conn, params) do
  xml = conn.private[:raw_body]
  Logger.debug(xml)
  text conn, xml
end

endpoint.ex中:

def copy_req_body(conn, _) do
  Plug.Conn.put_private(conn, :copy_raw_body, true)
end

plug :copy_req_body

我是 Phoenix 和 Elixir 的新手,所以我不确定如何调试它。为什么 HTTP 请求的编码会对原始正文数据的读取产生影响?我的应用程序需要接受 text/xml 并将请求正文作为字符串读取。

我明白了。在 code from here 中,解析方法接受编码 application/x-www-form-urlencoded。我将其更改为:

def parse(conn, "text", "xml", _headers, opts) do
...
end

现在可以使用了。

很简单的方法。不过不确定是不是 "wrong"。

defmodule YourApp.YourController do
  use YourApp.Web, :controller

  def receive_obm(conn, params) do
    {:ok, body, _conn} = Plug.Conn.read_body(conn)

    IO.inspect(body)
  end
end