2016-04-09 7 views
0

少なくとも、the routing DSLを使用しているときに、リクエスト本体のクラスが呼び出し元によってボディが提供されているかどうかを確認するapi(?たとえば空のボディを正常に処理するためのフレームワークを再生する

case PATCH(p"/foo") => Action { request => 
     val body: Option[JsValue] = request.body.asJson 
     body match { 
     case None => 
      Results.NoContent 
     case Some(body) => 
      Results.Ok(s"got post request with body of length ${body.toString.length}") 
     } 
    } 
    } 

しかしResults.NoContentに到達することはありませんし、「不正な要求」応答は例外Invalid Json: No content to map due to end-of-input...次のクライアントに送信されますJSONを期待し、それはに素敵だったかもしれません。発信者がボディを含まないような場合に、http "no content"レスポンスをどのように送信できるかを知っているといいでしょう。最初にテキストに変換し、次にJsonにしか対応しないと思います。どんなクリーナー?どうもありがとう!

答えて

1

JsScuccessまたはJsErrorを返すvalidate関数を使用できます。

implicit request => 
    request.body.validate[ContractorRequest] match { 
     case s: JsSuccess[ContractorRequest] => 
     val contractor = Contractor.fromRequest(s.get) 
     contractorsService.update(contractor).map { contractor => 
      Ok(Json.toJson(contractor)) 
     } 
     case e: JsError => 
     Future.successful(BadRequest(Json.toJson(ErrorWrapper("invalidJson", JsError.toJson(e).toString)))) 
    } 
1

あなたの特定の質問に答えるには:自分で空の身体のチェックを実装する必要があります。コードに関しては、自動的に400を送るべきではありません。

ActionまたはAction.asyncの引数としてbodyパーザを使用して、リクエストのコンテンツタイプをjsonに指定できます。 さらに、JSONをdesereializeするためのcaseクラスは、typeパラメータを使用してボディパーサーで指定できます。

case class Foo(bar: String) 
object Foo { 
    implicit val format = Json.format[Foo] 
} 

... 

case PATCH(p"/foo") => Action(parse.json[Foo]) { request => 
    val foo = request.body 
    Ok(s"got valid request with $foo") 
} 

これはBadRequest

空体のリクエストに応答することで、無効なJSONペイロードを持つ要求を処理するには、無効であるとBadRequestで対応しなければなりません。 ここにドキュメントがあります:https://www.playframework.com/documentation/2.6.x/api/scala/index.html#play.api.mvc.DefaultPlayBodyParsers

関連する問題