gpt4 book ai didi

elixir - 基于负载的Phoenix路由

转载 作者:行者123 更新时间:2023-12-02 19:19:50 25 4
gpt4 key购买 nike

我正在 Elixir/Phoenix 中实现后端 API。出于安全原因,我们决定在 URL 上显示尽可能少的内容,以便将要执行的操作嵌入到 POST 请求的 JSON 负载中。例如,我们将在 https://my.server 上发出 POST,而不是使用类似 REST 的请求 https://my.server.com/api/get_user/42 .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

它工作正常,但代码不是很清楚:一个大文件,使用相同的 Controller ApiController,而有一个 UserApiController 会更清晰管理用户,用于管理产品的 ProductApiController 等。

所以,我想知道是否有一种方法可以根据负载的内容而不仅仅是 URL 来选择要调用的模块和函数。

最佳答案

如果您已将结构定义为通过有效负载传递的“action”和“params”键值对,并且有数十个请求想要根据路径过滤并委托(delegate)给不同的 Controller ,那么您应该能够拥有像端点中定义的那样插入。 ex 在插入 YourApp.Router 调用

之前
  plug Plug.Session, @session_options
plug UrlFromPayloadAction, []
plug StackoverflowApiWeb.Router

这个插件会改变路径信息,因此我们修改后的网址将由路由器解析,我们可以根据操作定义 Controller ,例如 post "/get_user/:id"、ApiUserController、:process 和其他 Controller 已定义。

defmodule UrlFromPayloadAction do
import Plug.Conn

def init(default), do: default

def call(%Plug.Conn{params: %{"action" => action,
"params" => %{ "id" => id }
}} = conn, _default) do
conn = conn
|> assign(:original_path_info, conn.path_info)
|> assign(:original_request_path, conn.request_path)

%Plug.Conn{conn | path_info: conn.path_info ++ [ "#{action}", "#{id}" ] , request_path: conn.request_path <> "/#{action}/#{id}" }
end
def call(conn, _default), do: conn
end

这更像是解决这个问题的一种可变方式,这可能违背像 Elixir 这样的功能框架的一般哲学

关于elixir - 基于负载的Phoenix路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com