使用Plug.Router這個模組,我們可以輕鬆完成http router的功能。
根據不同的 path 還有 request method,我們可能會導向不同的請求。
首先,承上一章節,我們修改application.ex
children = [
# {Plug.Cowboy, scheme: :http, plug: ExamplePlug, options: [port: 4001]} # 註解掉
Plug.Adapters.Cowboy.child_spec(
scheme: :http,
plug: TestApp.Router,
options: [port: 4001]
)
]
然後,新增TestApp.Router
這個模組:
lib/test_app/router.ex
defmodule TestApp.Router do
use Plug.Router # 引入路由模組
plug :match
plug :dispatch
get "/page1" do
send_resp(conn, 200, "page1")
end
get "/page2" do
send_resp(conn, 200, "page2")
end
match _ do
send_resp(conn, 404, "Page not found")
end
end
這邊的:match和:dispatch是他需要的兩個插件。 :match
負責查找匹配的路由,然後轉發到:dispatch
派發工作。
重新執行mix run --no-halt
,檔案會被重新編譯。便可以經由瀏覽器看到結果。
Poison
poison 是毒藥的意思,在Elixir社群裡面,好像有許多這種中二的名稱 (?)
Posion這個套件,可以做倒 json encode 跟 decode 的功能,甚至不只是 json,還支援許多的格式,是個非常方便的套件。
首先先安裝poison,更新mix.exs後,執行mix deps.get
:
defp deps do
[
{:plug_cowboy, "~> 2.0"},
{:poison, "~> 3.1"}
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
然後修改:lib/test_app/router.ex
get "/page1" do
content = Poison.encode!(%{name: "Jack", age: 27})
send_resp(conn, 200, content)
end
這樣就完成了,藉由poison,我們就可以完成一個簡單的API了~