🔗

Play Framework+Scala レシピ #3 ─ パラメータ付きルートで “Hello, Alice” を返す

に公開

0. ウォームアップ — プロジェクトを起動しておく

cd play-samples/play-scala-hello-world-tutorial
sbt run          # 前回からターミナルを残しているなら不要

起動済みのまま ソース保存 ⇒ ホットリロード で進めます。
ターミナルを止めてしまった人は再度 run してください。

1. コントローラを拡張 — 動的テキストを返す

app/controllers/HelloController.scala を開き、次のメソッドを 追記 します。

package controllers

import javax.inject._
import play.api.mvc._

@Singleton
class HelloController @Inject()(cc: ControllerComponents)
    extends AbstractController(cc) {

  // 既存の hello メソッドはそのまま

  /** パスパラメータ name を受け取り動的文字列を返す */
  def greet(name: String) = Action { implicit request: Request[AnyContent] =>
    Ok(s"Hello, $name!")
  }
}
役目
def greet(name: String) 文字列パラメータ name を関数引数で受け取る
Ok(s"...") Play の Result 生成ヘルパー。s"文字列補間

2. routes に パラメータ付き エンドポイントを 1 行追加

conf/routes を開き、ファイル末尾に次を追加して保存します。

# --- ここから追加 ---
GET   /hello/:name        controllers.HelloController.greet(name: String)

3. ブラウザ / curl で動作確認

curl http://localhost:9000/hello/Alice
# Hello, Alice!

curl http://localhost:9000/hello/Bob
# Hello, Bob!

4. HTML ビュー版も作ってみよう(おまけ)

同じパラメータを Twirl テンプレート に渡して HTML を返す手順です。

4-1. テンプレートを追加

app/views/greet.scala.html を新規作成。

@(name: String)

@main("Greeting") {
    <h1>Hello, @name!</h1>
}

4-2. Controller に HTML 用メソッドを追加

def greetHtml(name: String) = Action { implicit request =>
  Ok(views.html.greet(name))
}

4-3. routes に登録

GET   /hello/html/:name   controllers.HelloController.greetHtml(name: String)

保存すると再コンパイル。
ブラウザ http://localhost:9000/hello/html/Play で「Hello, Play!」の HTML 版 が表示されれば成功です。

5. よくあるつまずき Q&A

症状 チェックポイント
404 が返る routes 保存し忘れ / 行末の空行不足 / URL タイポ
500 or コンパイルエラー Scala ファイル名・クラス名一致? greet メソッドの引数と routes の型が一致?
日本語パラメータが文字化け URL エンコード必須:/hello/%E3%81%82%E3%81%84%E3%81%86
再コンパイルが遅い sbt シェルで ~run を使うとファイル変更検知が高速

6. まとめ 🎯

  • パスパラメータ/foo/:bar + def action(bar: String) の組み合わせで簡単
  • テキスト・JSON・HTML 返却のどれも Ok(...) で統一インターフェース
  • ホットリロードなので 保存→ブラウザ更新 の開発ループが超高速

これで 「固定文字列レスポンス」→「動的レスポンス」 へ一歩前進しました。
次回は フォーム POST を受け取り、バリデーションして JSON を返す ところまで掘り下げる予定です。

Enjoy Play & Happy Coding! 🔗💥

Discussion