Unfilteredでリクエストパラメータを取得する

リクエストのルーティングを行うパターンマッチでParamsという抽出子を使用することでリクエストパラメータをMap[String, Seq[String] ]で取得することができます。

// POSTメソッドによる/resultに対するリクエスト
case POST(Path("/result") & Params(params)) => Ok ~> {
  // nameという名前のパラメータを取得
  val name = params.get("name").head

  Html(<p>Hello {name}!</p>)
}

また、リクエストパラメータを抽出するための抽出子を作成することでパラメータの有無などによってマッピングを行うこともできます。抽出子はParams.Extractを継承して作成します。

// nameは必須のパラメータ
object Name extends Params.Extract(
  "name",
  Params.first ~> Params.nonempty)

// ageはInt型のパラメータ
object Age extends Params.Extract(
  "age",
  Params.first ~> Params.int)

これらの抽出子は以下のようにしてリクエストのルーティングに使用することができます。パスやメソッドが一致していても、リクエストパラメータが不正な場合はこのパターンへのルーティングは行われません。なので入力チェックの代わりに使用することもできます。

// nameとageが正しい値の場合のみ有効なマッピング
case POST(Path("/result") & 
  Params(Name(name) & Age(age))) => 
    Ok ~> Html(<p>{name} is {age} years old.</p>)