Получение необработанного тела HTTP-запроса в Phoenix
Я следил за этой проблемой, чтобы получить необработанное тело из 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
Я новичок в Фениксе и Эликсире, поэтому я не уверен, как это отладить. Почему кодирование HTTP-запроса имеет значение для чтения необработанных данных тела? Моя заявка должна быть принята text/xml
и прочитать тело запроса в виде строки.
3 ответа
Я понял. В коде отсюда метод parse принимает кодировку application/x-www-form-urlencoded
, Я изменил это на это:
def parse(conn, "text", "xml", _headers, opts) do
...
end
И теперь это работает.
Довольно простой способ. Не уверен, если это "неправильно" или нет, хотя.
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
Феникс должен разобрать его из коробки. Убедитесь, что вы отправляете правильные заголовки в первую очередь. Никаких действий не требуется
-H 'content-type: application/json;charset=UTF-8'