Phoenixで簡単なHTTPサーバー

仕事で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"}

動きました。