Получение необработанного тела 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'
Другие вопросы по тегам