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
带有查询字符串,因此我可以从那里获取值。
我仅限于将 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
带有查询字符串,因此我可以从那里获取值。