2017-04-15 74 views
1

每當我創造它接受JSON身體POST方法條目,我寫的東西,如:PlayFramework的Json驗證樣板

req.body.validate[SomeBodyClassRepresentation].fold(
    errors => logErrorAndReturnBadRequest(), 
    valid => handleRequest() 
) 

有什麼辦法來減少樣板,因爲處理畸形的JSON體幾乎總是做一樣的方法? 我正在考慮一些類似ActionBuilder的東西,它可以適應不同的請求類型。

+0

這裏的傳統是在提問之前發佈你已經嘗試過的**! –

回答

1

你可以做一個包裝錯誤處理行爲的方法,是這樣的:

def withParsedJsonRequest[T](actionBody: T => Future[Result])(
implicit reads: Reads[T], req: Request[JsValue]): Future[Result] = { 
    req.body.validate[T].fold(
    invalid => { Future.successful(BadRequest("An error occured...")) }, // do error handling here! 
    valid => { actionBody(valid) }) 
} 

,並用它在Action S:

def bla = Action.async(parse.json) { implicit req => 
    withParsedJsonRequest[Bla] { b => 
    Future.successful(Ok) 
    } 
} 

你要通過隱TReads(用於解析JSON)到withParsedJsonRequest函數,還有Request[JsValue](所以你不必重複它)。

稱爲「actionBody」的回調函數是您的行爲的肉。它需要解析T並用它做一些事情。

我想你可以創建一個自定義Action但何必呢......

+0

'withParsedJsonRequest'也可能會收到一個'invalid'函數,其默認值 – pedrorijo91

0

如果你有範圍的隱含Reads[T],並同意使用Play的錯誤處理程序(你能以某種方式自定義),有一個身體解析器你想要的東西,不只是:

def foo = Action(parse.json[T]) { request => 
    val body: T = request.body 
    ... 
} 

不過請注意,這個返回400,如果Content-Type未設置爲application/json(沒有等效採用tolerantJson)。