Я реализую backend API в Elixir / Phoenix. По соображениям безопасности было решено показывать как можно меньше в URL-адресе, чтобы выполняемое действие было встроено в полезную нагрузку JSON запросов POST. Например, вместо того, чтобы иметь REST-подобный запрос https://my.server.com/api/get_user/42
, мы выполним POST на https://my.server.com/api/
со следующей полезной нагрузкой:
{
"action" : "get_user",
"params" : {
"id" : 42
}
}
Пока мой маршрутизатор выглядит так:
scope "/api", AlaaarmWeb do
pipe_through :api
post "/", ApiController, :process
match :*, "/*path", ApiController, :error_404
end
и у меня есть набор process
функций, которые соответствуют шаблону на карте params
:
def process(conn, params = %{"action" => "get_user"}) do
# ... get the user from the DB in resp, and sed back
json(conn, resp)
end
Он работает нормально, но код не очень понятен: один большой файл, используйте тот же контроллер, ApiController
, хотя было бы гораздо понятнее иметь UserApiController
для управления пользователями, ProductApiController
для управления продуктами и т. д. c ..
Итак, я было интересно, есть ли способ сделать выбор модуля и функции для вызова также на основе содержимого полезной нагрузки, а не только на URL.