[play 2.1.1] How to handle malformed JSON

183 views
Skip to first unread message

Andy Hull

unread,
Jul 3, 2013, 5:31:41 PM7/3/13
to play-fr...@googlegroups.com
Hi everyone,

I'm having trouble figuring out how to handle malformed JSON. I'm getting an HTML error page in the response body and instead I want to return my own JSON error document.

i.e. get this response:

<!DOCTYPE html>
<html>
<head>
<title>Bad request</title>
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlFJREFUeNqUU8tOFEEUPVVdNV3dPe8xYRBnjGhmBgKjKzCIiQvBoIaNbly5Z+PSv3Aj7DSiP2B0rwkLGVdGgxITSCRIJGSMEQWZR3eVt5sEFBgTb/dN1yvnnHtPNTPG4PqdHgCMXnPRSZrpSuH8vUJu4DE4rYHDGAZDX62BZttHqTiIayM3gGiXQsgYLEvATaqxU+dy1U13YXapXptpNHY8iwn8KyIAzm1KBdtRZWErpI5lEWTXp5Z/vHpZ3/wyKKwYGGOdAYwR0EZwoezTYApBEIObyELl/aE1/83cp40Pt5mxqCKrE4Ck+mVWKKcI5tA8BLEhRBKJLjez6a7MLq7XZtp+yyOawwCBtkiBVZDKzRk4NN7NQBMYPHiZDFhXY+p9ff7F961vVcnl4R5I2ykJ5XFN7Ab7Gc61VoipNBKF+PDyztu5lfrSLT/wIwCxq0CAGtXHZTzqR2jtwQiXONma6hHpj9sLT7YaPxfTXuZdBGA02Wi7FS48YiTfj+i2NhqtdhP5RC8mh2/Op7y0v6eAcWVLFT8D7kWX5S9mepp+C450MV6aWL1cGnvkxbwHtLW2B9AOkLeUd9KEDuh9fl/7CEj7YH5g+3r/lWfF9In7tPz6T4IIwBJOr1SJyIGQMZQbsh5P9uBq5VJtqHh2mo49pdw5WFoEwKWqWHacaWOjQXWGcifKo6vj5RGS6zykI587XeUIQDqJSmAp+lE4qt19W5P9o8+Lma5DcjsC8JiT607lMVkdqQ0Vyh3lHhmh52tfNy78ajXv0rgYzv8nfwswANuk+7sD/Q0aAAAAAElFTkSuQmCC">
   <style>
   html, body, pre {
       margin: 0;
       padding: 0;
       font-family: Monaco, 'Lucida Console', monospace;
       background: #ECECEC;
   }
   h1 {
       margin: 0;
       background: #AD632A;
       padding: 20px 45px;
       color: #fff;
       text-shadow: 1px 1px 1px rgba(0,0,0,.3);
       border-bottom: 1px solid #9F5805;
       font-size: 28px;
   }
   p#detail {
       margin: 0;
       padding: 15px 45px;
       background: #F6A960;
       border-top: 4px solid #D29052;
       color: #733512;
       text-shadow: 1px 1px 1px rgba(255,255,255,.3);
       font-size: 14px;
       border-bottom: 1px solid #BA7F5B;
   }
</style>
</head>
<body>
<h1>Bad request</h1>

<p id="detail">
For request 'POST /api/user' [Invalid Json]
</p>

</body>
</html>

I've tried a couple of patterns:

def createUser() = Action(parse.json) {
    request =>
      request.body.asInstanceOf[JsValue].validate[(UserWrapper)].fold(
        valid = { myValidContent => /* something */},
        invalid = { errors => BadRequest(Json.toJson(badJSON(errors))) })
  }

and

  def createUser() = Action(parse.json) {
    request =>
      request.body.asInstanceOf[JsValue].validate[(UserWrapper)].map {
        case (myValidContent) => /* something */
      }.recoverTotal {
         error => BadRequest(Json.toJson(badJSON(error)))
      }
}

but i think the BadRequest is returned before the validate method is called and therefore prior to my handling code. Is there a way to handle this cleanly across all my controllers?

Thanks for the help!

--Andy

Otto

unread,
Jul 4, 2013, 8:06:14 AM7/4/13
to play-fr...@googlegroups.com
Hi,

you could write your own body parser or the way the json bodyparser treats the data. I don't know whether that's the best solution, but here's the code which returns the badrequest. Shouldn't be too hard I think: 


then you would do something like Action(myJsonParser) { ... }

Cheers,
Otto

Pascal Voitot Dev

unread,
Jul 4, 2013, 8:08:13 AM7/4/13
to play-fr...@googlegroups.com
Yes and you can also use the AnyContent parser and parse json yourself...

Pascal


--
You received this message because you are subscribed to the Google Groups "play-framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to play-framewor...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Reply all
Reply to author
Forward
0 new messages