在 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
我已经按照 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