仕事でElixirを使い始めました。Phoenixを調べています。
Phoenixのプロジェクトでデフォルトで作られるのはWebサイト的なアプリケーションですが、ビューはいらないので、デフォルトで作られたものをいじって、POSTでリクエストを受け取ってレスポンスを返すだけの簡単なサーバーにしました。
まず、コントローラを切り替えるweb/router.ex
。デフォルトではブラウザからGETリクエストしか来ないようにCSRFトークンの検証とかをしていますが、これはいらないので削除します。
# web/router.ex defmodule HelloPhoenix.Router do use HelloPhoenix.Web, :router # 1. これいらない # pipeline :browser do # plug :accepts, ["html"] # plug :fetch_session # plug :fetch_flash # plug :protect_from_forgery # plug :put_secure_browser_headers # end pipeline :api do plug :accepts, ["json"] end scope "/", HelloPhoenix do # 2. :browserから:apiに変更 pipe_through :api # 3. postも受け取れるようにする get "/", PageController, :index post "/hello", PageController, :hello end end
次に、コントローラ側 web/controllers/page_controller.ex
。HTMLをレンダリングする代わりに、レスポンスでJSONを返すようにします。
defmodule HelloPhoenix.PageController do use HelloPhoenix.Web, :controller def index(conn, _params) do conn |> json(%{key: "pong"}) end def hello(conn, _params) do conn |> json(%{key: "pong"}) end end
あとはHTTPクライアントからアクセスしてみます。これは何を使ってもいいですが、Ruby標準のNet::HTTP
を使いました。
require 'net/http' # POST uri = URI('http://localhost:4000/hello') res = Net::HTTP.post_form(uri, 'key' => 'ping') puts res.body # => {"key":"pong"} # GET uri = URI('http://localhost:4000') puts Net::HTTP.get(uri) # => {"key":"pong"}
動きました。