6

scala 2.0.2 play フレームワークを使用して Web API を実装しています。いくつかの get パラメータを抽出して検証したいと思います。このために、オプションのフィールドを定義できるプレイ「フォーム」を使用しています。

問題: これらのオプションのフィールドについて、パラメーターが渡されない場合、デフォルト値を定義する必要があります。このコードは、次の 3 つのユース ケースを正しく解析することを目的としています。

  • /test?top=abc (エラー、abc は整数ではありません)
  • /test?top=123 (有効、top は 123)
  • /test (有効、top は 42 (デフォルト値))

私は次のコードを思いつきました:

def test = Action {
  implicit request =>

  case class CData(top:Int)

  val p = Form(
    mapping(
      "top" -> optional(number)
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top)))
  ).bindFromRequest()

  Ok("all done.")
}

コードは機能しますが、エレガントではありません。欠落しているリクエスト パラメータのデフォルト値を設定するためだけに、多くのボイラー プレートが実行されています。

よりクリーンでより正確なソリューションを提案できる人はいますか?

4

2 に答える 2

12

インプレイ 2.1

val p = フォーム(
    マッピング(
      "トップ" -> デフォルト(数値,42)
    )(CData.apply)(CData.unapply)
  .bindFromRequest()

あなたが望むことをします。

于 2012-12-04T09:30:26.200 に答える
9

これは、クエリ文字列パラメーターを検証するルーター ジョブです。routesファイルでパラメーターを定義するだけです。

GET /test controllers.Application.test(top: Int ?= 42)

そして、コントローラーメソッドにパラメーターとして追加topします。

def test(top: Int) = Action {
  // Use top here
  val data = CData(top)
}

次に、Play がすべての検証作業を行います。?=構文を使用してデフォルト値を指定する方法に注意してください。

フォームは POST リクエストにのみ使用してください。

アップデート:

パラメータを手動でチェックしたい場合は、ヘルパー メソッドを定義できます。

def getQueryParam(key: String, default: String)(implicit request: RequestHeader) =
  request.queryString.get(key).flatMap(_.headOption).getOrElse(default)

そして、コントローラーメソッド内で使用します:

def test = Action { implicit request =>
  val top = getQueryParam("top", "42")
  ...

しかし、これを行うと、型チェックが失われます。もちろん、各タイプ、つまり などに対してヘルパーを定義できますgetIntParamgetStringParam、Play には、そのような種類の問題を解決するように設計された安全なルーター実装が既に含まれています。手動チェックではなく、ルーティング メカニズムを使用することをお勧めします。

于 2012-07-08T10:41:34.940 に答える