如何在运行时调用Plug.Router宏定义的路由?

How do I call the route defined by the Plug.Router macro at runtime?

我可以手动构建一个 conn 然后像函数一样调用它们吗?如果你不明白"them"是什么意思,请看下面的代码

例如定义一条路线/ping

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

我知道可以用use Plug.Test中的conn函数来完成,但是是基于HTTP Client的,不是runtime函数调用,效率太低

标准方法如您所说,使用 Plug.Test.conn/3 构建一个 %Plug.Conn{} 结构,该结构将调用该路由。

所有插件都有一个 call/2 功能,这是在运行时可用的功能。

示例:

conn = Plug.Test.conn(:get, "/ping", "")
conn = YourModule.Router.call(conn, [])

get 宏在编译时 compiled 变成一个私有 match/3 函数,它本身由 call/2 函数调用并且还需要 conn 结构。因此,您必须使用 call/2 回调进行运行时测试,除非您从路由器模块内部调用 match/3Plug.Test.conn/3 不使用 HTTP 客户端 - 它只是生成一个结构。我认为您对效率低下的担忧是没有根据的。