params不包含Elixir / Phoenix中的POST Body

时间:2016-08-08 14:31:04

标签: elixir phoenix-framework

我尝试构建一个非常简单的REST API。它不包括数据库或模型。

这是我的路由器:

defmodule Zentonies.Router do
  use Zentonies.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

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

  scope "/v1/events/", Zentonies do
    pipe_through :api
    post "/call", PageController, :call
  end

end

这是控制器:

defmodule Zentonies.PageController do
  require Logger
  import Joken
  use Zentonies.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end

  def call(conn, params) do
    Logger.debug inspect(params)
    conn
    |> put_status(200)
    |> text("Response.")
  end
end

现在,如果我向此端点发送HTTP POST,inspect(params)不会返回我的POST请求的JSON正文。而是返回:call

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:11)

call/2函数defined by Phoenix用于在每个Phoenix Controller中调度到正确的操作。通过创建具有该名称的函数,您将覆盖内置功能。您将不得不为该操作使用其他名称。请查看Phoenix.Controller.Pipeline文档中的“控制器插头”部分:

  

控制器是插头

     

与路由器一样,控制器是插件,但它们被连接到一个称为动作的特定功能。

     

例如,路线:

get "/users/:id", UserController, :show
     

将调用UserController作为插件:

UserController.call(conn, :show)
     

将触发插件管道,最终将调用内部动作插件,该插件将分派到show/2中的UserController函数。