gpt4 book ai didi

elixir - Elixir 插件中的版本控制 API

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

我有两个模块:lib/endpoints/v1/base.ex 和 lib/endpoints/v2/base.ex。

lib/endpoints/v1/base.ex

defmodule Http.Endpoints.V1.Base do
require Logger
use Plug.Router

plug(:match)
plug(:dispatch)
plug(Plug.Logger)
plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)

get "/v1/ping" do
send_resp(conn, 200, "pong!")
end
end

lib/endpoints/v2/base.ex

defmodule Http.Endpoints.V2.Base do
require Logger
use Plug.Router

plug(:match)
plug(:dispatch)
plug(Plug.Logger)
plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)

get "/v2/ping" do
send_resp(conn, 200, "pong! 2")
end
end

如果我将子项放入 applications.ex 中,我的端点将正常工作

Plug.Cowboy.child_spec(scheme: :http, 插件: Http.Endpoints.V1.Base, options: [port: Application.get_env(:http, :port)])

但我希望我的应用程序启动所有端点版本。

我尝试使用 require Http.Endpoints.V1.Baserequire Http.Endpoints.V2.Base 创建 lib/endpoints.ex 并更改了我的 applications.ex但没有成功。

最佳答案

您可以从端点文件转发到其他路由器。以下是 forward/2 函数的文档:https://hexdocs.pm/plug/Plug.Router.html#forward/2

基本上,您为 v1 和 v2 创建 2 个路由器:

defmodule MyAppWeb.V2.Router do
use Plug.Router

plug :match
plug :dispatch

get "/ping" do
send_resp(conn, 200, "OK")
end
end

defmodule MyAppWeb.V1.Router do
use Plug.Router

plug :match
plug :dispatch

get "/ping" do
send_resp(conn, 200, "OK")
end
end

然后在您的端点中,您可以添加所有常用功能并转发到您的版本化路由,如下所示:

defmodule MyAppWeb.Endpoint do
require Logger
use Plug.Router

plug :match
plug :dispatch
plug Plug.Logger
plug Plug.Parsers, parsers: [:json], json_decoder: Poison

# Forwarding
forward "/v2", to: MyApp.V2.Router
forward "/v1", to: MyApp.V1.Router

# You should put a catch-all here
match _ do
send_resp(conn, 404, "Not Found")
end
end

然后在您的 application.ex 文件中,像之前一样安装端点。不过,此时您应该能够从同一端口 ping /v1/ping/v2/ping

干杯!

关于elixir - Elixir 插件中的版本控制 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56994191/

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