2016-09-05 64 views
2

所以我有一個路由文件看起來是這樣的:如何驗證Play Framework中的可選查詢參數?

GET  /myRes     controllers.MyController.get(ids: Option[String], elems: Option[String]) 

一切都很好。用戶可以通過做得到的東西:

/myRes 
/myRes?ids=X 
/myRes?elems=Y 
/myRes?ids=X&elems=Y 

然而,它們還可以通過執行查詢的接口:

/myRes?id=X 

這是有問題的,因爲在這種情況下,用戶得到的結果,如果同他們詢問/myRes,這幾乎肯定不是他們預期的結果。這對API的開發人員造成了很多混淆/錯誤。有沒有一種優雅的方式來捕獲傳遞給控制器​​的不正確/未指定的查詢參數,並返回此類查詢的硬錯誤?

編輯:將標題更改爲更具描述性的內容。我的問題基本上是驗證查詢參數,以捕獲傳遞給API的任何查詢參數,這些參數是無效的/正確的。

回答

0

我通常把它傳遞這樣的get方法

GET /getSomething  Controllers.Application.getData() 

GET /getSomething/:id   Controllers.Application.getData(id:Integer) 

GET /getSomething/:id/:name   Controllers.Application.getData(id:Integer, name :String) 
+0

感謝您的回覆。但是,這與設置所需的參數基本相同。這也適用於查詢參數,但不是我想要做的。沒有一個查詢參數是必需的,我不想指定每個可能的查詢參數組合 - 這不能超過2-3個參數。 –

+0

我改變了標題,希望讓問題更清楚。 –

0

它可以與宏註釋類似以下的幫助來完成:

import scala.reflect.macros.whitebox.Context 
import scala.language.experimental.macros 
import scala.annotation.StaticAnnotation 
import scala.annotation.compileTimeOnly 
import play.api.mvc._ 

@compileTimeOnly("respond 400 bad request in case of unexpected params") 
class StrictParams extends StaticAnnotation { 
    def macroTransform(annottees: Any*): Any = macro StrictParamsMacro.impl 
} 

object StrictParamsMacro { 
    def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = { 
    import c.universe._ 
    annottees.map(_.tree).toList match { 
     case q"def $name(..$params) = $action { ..$body }" :: Nil => 
     val supportedParamNames = params.map(ab => ab.name.toString).toSet 
     c.Expr[Any](
      q"""def $name(..$params) = { req: Request[_] => 
      val unsupportedParams = req.queryString.keySet -- $supportedParamNames 
      if (unsupportedParams.nonEmpty) { 
       BadRequest(unsupportedParams.mkString("Unsupported Params: ", ", ", "")) 
      } else { 
       $body 
      } 
      }""" 
     ) 
    } 
    } 
} 

然後你就可以註釋動作方法像這樣:

@StrictParams 
def get(ids: Option[String], elems: Option[String]) = Action { 
    ... 
} 
+0

非常有趣。將嘗試這個儘快。 –

+0

嗯,似乎沒有工作。當我們嘗試這個時,我們會在編譯步驟中得到一個「[error] /*/app/controllers/MyController.scala:88:在出現意外的參數的情況下響應400錯誤的請求」。我們錯過了什麼嗎? –

+0

宏觀天堂需要編譯。將以下設置添加到您的項目 - 宏庫和使用它的項目。 '''addCompilerPlugin(「org.scalamacros」%「paradise」%2.1.0「cross CrossVersion.full)''' – thirstycrow