我尝试构建一个非常简单的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
。
非常感谢任何帮助!
答案 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
函数。