[英]How do I serve both web pages and API Routes by using same port address and different Handle pattern
[英]Elixir - How do I manage routes using Cowboy (and nothing else)?
我僅限於將 Cowboy 用於 web 服務器,該服務器處理 JSON REST ZDB9744A7387143CACE1463 我需要能夠只使用 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")
返回 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
帶有查詢字符串,因此我可以從那里獲取值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.