2012-07-07 9 views
6

私はscala 2.0.2プレイフレームワークを使用してWeb APIを実装しています。私はいくつかの取得パラメータを抽出して検証したいと思います。そしてこれのために私はオプションのフィールドを定義することができる遊びの "フォーム"を使用しています。デフォルト値を定義する方法プレーフレームワークフォームのオプションフィールド?

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

  • /テストトップ= ABC(エラーは、ABCは整数でない)
  • /テスト= 123上面(有効、上面123です)?

    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.") 
    } 
    

    :私は次のコードが出ている

  • /テスト(有効、トップは42である(デフォルト値))

コードは機能しますが、それは間違いなくエレガントです。不足しているリクエストパラメータのデフォルト値を設定するだけで、多くのボイラープレートが使用されています。

誰もがよりクリーンでより一致したソリューションを提案できますか?

答えて

8

これは、クエリ文字列パラメータを検証するためのルータージョブです。ただ、routesファイルにあなたのパラメータを定義します。

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

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

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

次に、あなたのためのすべての検証作業を行い再生します。 ?=構文を使用して指定されたデフォルト値に注意してください。

フォームは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には既に安全なルータ実装が含まれています。私は手動でのチェックの代わりにルーティングメカニズムを使用するようにアドバイスします。プレイ中

+0

この提案されたソリューションはうまく機能します。残念ながら、このソリューションの唯一の欠点は、多数のデフォルトパラメータではうまく調整できないことです。リスティングフィルタリングをサポートする必要があるWebサービス/ Webアプリケーションを構築する場合、ルート内のすべてのデフォルトパラメータを公開すると、コードの読みやすさと堅牢性が低下する可能性があります。他のすべてのシナリオではこれは確かに好ましい解決策です – natbusa

+1

役に立つと思われるヘルパーメソッドの実装で更新されました。 – lambdas

+1

私は、デフォルトのパラメータについてよりコード駆動型のアプローチをプログラムするために、プレイフレームワークの拡張を提案しました。 https://github.com/playframework/Play20/pull/381を参照してください。 – natbusa

12

2.1

 
val p = Form(
    mapping(
     "top" -> default(number,42) 
    )(CData.apply)(CData.unapply) 
).bindFromRequest() 

は、あなたがやりたいだろう。

関連する問題