Plug.Parsers.JSON
обрабатывает только тип содержимого application/json
.По этой причине body_params
не заполняется.Ваш тестовый JSON также недопустим - имена свойств объекта не были заключены в кавычки.
curl -H "Content-Type: application/json" -d '{"one": 1, "two": 2}' 127.0.0.1:8080/test
Опция pass:
для Plug.Parsers
указывает ему игнорировать запросы тех типов, для которых существуетне определен синтаксический анализатор (например, text/json
в вашем случае), вместо того, чтобы вызывать UnsupportedMediaTypeError
, что обычно и происходит.Добавление этой опции скрывало ошибку.
Может оказаться полезным use
Plug.Debugger
во время разработки - это даст вам лучшую информацию о том, что происходит в неожиданных ситуациях.
Если по какой-то причине вам нужно иметь возможность анализировать JSON с нестандартным типом text/json
(например, из-за запросов от программного обеспечения, которое вы не можете контролировать), вы можете определить новый анализатор для этого типа, которыйпросто оборачивает Plug.Parsers.JSON
и переписывает text/json
в application/json
:
defmodule WrongJson do
def init(opts), do: Plug.Parsers.JSON.init(opts)
def parse(conn, "text", "json", params, opts) do
Plug.Parsers.JSON.parse(conn, "application", "json", params, opts)
end
def parse(conn, _type, _subtype, _params, _opts), do: {:next, conn}
end
Затем добавьте его в свой список анализаторов:
plug Plug.Parsers,
parsers: [:json, WrongJson],
json_decoder: Jason
Теперь text/json
также будет работать.