Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir Plug中的API版本控制_Elixir_Plug - Fatal编程技术网

Elixir Plug中的API版本控制

Elixir Plug中的API版本控制,elixir,plug,Elixir,Plug,我有两个模块:lib/endpoints/v1/base.ex和lib/endpoints/v2/base.ex lib/endpoints/v1/base.ex defmodule Http.Endpoints.V1.Base do 需要记录器 使用插头路由器 插头(:匹配) 插头(:调度) 插头(插头记录器) plug(plug.Parsers,解析器:[:json],json_解码器:Poison) 获取“/v1/ping”do 发送响应(conn,200,“砰!”) 结束 结束 lib

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

lib/endpoints/v1/base.ex

defmodule Http.Endpoints.V1.Base do
需要记录器
使用插头路由器
插头(:匹配)
插头(:调度)
插头(插头记录器)
plug(plug.Parsers,解析器:[:json],json_解码器:Poison)
获取“/v1/ping”do
发送响应(conn,200,“砰!”)
结束
结束
lib/endpoints/v2/base.ex

defmodule Http.Endpoints.V2.Base do
需要记录器
使用插头路由器
插头(:匹配)
插头(:调度)
插头(插头记录器)
plug(plug.Parsers,解析器:[:json],json_解码器:Poison)
获取“/v2/ping”do
发送响应(conn,200,“砰!2”)
结束
结束
如果我放入我的应用程序,我的端点工作正常。例如,孩子们

Plug.Cowboy.child_spec(
   scheme: :http, 
   plug: Http.Endpoints.V1.Base, 
   options: [port: Application.get_env(:http, :port)]
)
Plug.Cowboy.child_规范(scheme::http,Plug:http.Endpoints.V1.Base,选项:[端口:应用程序.get_环境(:http,:端口)])

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

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

您可以从端点文件转发到其他路由器。以下是
转发/2
功能的文档:

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

defmodule MyAppWeb.V2.do
使用插头路由器
插头:匹配
插头:调度
获取“/ping”do
发送响应(conn,200,“正常”)
结束
结束

defmodule MyAppWeb.V1.do
使用插头路由器
插头:匹配
插头:调度
获取“/ping”do
发送响应(conn,200,“正常”)
结束
结束
然后在端点中,您可以添加所有通用功能并转发到您的版本路由,如下所示:

defmodule MyAppWeb.Endpoint do
需要记录器
使用插头路由器
插头:匹配
插头:调度
插塞式记录器
plug-plug.parser,parser:[:json],json_解码器:Poison
#转发
转发“/v2”,至:MyApp.v2.Router
转发“/v1”,至:MyApp.v1.Router
#你应该在这里放一个通缉令
相配
发送响应(conn,404,“未找到”)
结束
结束
然后在
application.ex
文件中,像以前一样装载端点。但是,此时您应该能够从同一端口ping
/v1/ping
/v2/ping

干杯

如果我放入我的应用程序,我的端点可以正常工作 孩子们

Plug.Cowboy.child_spec(
   scheme: :http, 
   plug: Http.Endpoints.V1.Base, 
   options: [port: Application.get_env(:http, :port)]
)
现代的方法是:

{Plug.Cowboy, [[ 
      scheme: :http, 
      plug: Http.Endpoints.V1.Base, 
      options: [port: Application.get_env(:http, :port)]
    ]]
}
见:


虽然,对我来说,直接调用
child_spec()
似乎更容易,而不是试图计算围绕参数需要多少括号。

我们不需要在子路由器上进行匹配和调度吗?我不是100%确定这是必需的,但我记得在过去必须这样做。我只是尝试过,这是肯定需要的。代码编译为
Plug.Router
公开
init/1
call/2
,但如果我们不在子路由器的管道中添加
:match
:dispatch
,连接将挂起或干脆失败(因为它不会传递到路由器模块中配置的路径)。我把它们添加到答案中是为了节省人们尝试这个的时间。