Elixir - 如何使用 Cowboy(而不是其他)管理路线?

Elixir - How do I manage routes using Cowboy (and nothing else)?

我仅限于将 Cowboy 用于处理 JSON REST API 的 Web 服务器。我需要能够仅使用 Cowboy + 任何语言功能来管理和处理不同和可变的路由,以及使用 GET 值。

我正在获取以下例程中解释的路径:

def handle(req, router) do
  headers = [{"content-type", "application/json"}]
  {path, req}  = :cowboy_req.path(req)
  {:ok, resp} = :cowboy_req.reply(200, headers, router.call(path), req)
  {:ok, resp, router}
end

最终 route.call(path) 调用以下内容:

defp serve("/call/[:thing]") do
  list = [path: "oy"]
  IO.puts :thing
  {status, result} = JSON.encode(list)
  result
end

serve("/call") returns JSON 本身没有问题,但尝试向服务器请求 /call 下的任何其他路由时,它会用 404 回复(我已经处理过了)

处理这些动态路由的最佳方法是什么?请记住,我仅限于使用 Cowboy 而不是其他任何东西。

您的代码不是很清楚-您是如何启动服务器的?更具体地说,你是如何设置你的路由器的?这似乎是这里的问题,我猜你只为 /call.

创建了一条路线

你需要这样的东西:

dispatch_config = :cowboy_router.compile([{:_, [{"/call/[:thing]", YourHandlerModule, []}]}])
{ :ok, _ } = :cowboy.start_http(:http,
                                100,
                                [{:port, 8080}],
                                [{ :env, [{:dispatch, dispatch_config}]}]
                                )

路径 /call/[:thing] 应该在路由器上指定,而不是在您的处理程序中指定。

我找到了一个仅使用 Cowboy 和 Elixir 的简单解决方案:

def call(conn) do
  serve(conn.req_path, conn)
end

defp serve(<< "/call/", name::binary >>, conn) do
  list = conn.req_qs
  IO.puts name
  {_, result} = JSON.encode(list)
put_resp_body(conn, result)

如果你这样做,所有后续路线都会留在 rest。一个简单的拆分就可以了。 conn 带有查询字符串,因此我可以从那里获取值。