2016-06-02 8 views
2

In dem Code unten, bekomme ich eine http request im JSON-Format und konvertieren Sie es in ein Objekt der Klasse MyRequest. Dies funktioniert, wenn alle Felder in der JSON-Anfrage vorhanden sind, jedoch mit JsResultException abstürzt, wenn ein oder mehrere Felder fehlen. Was ist der beste Weg, um den Fehler zu finden?Spielen für Scala: Catch HTTP JSON Anfrage Fehler

request => val json = request.body 
    val req = json.as[MyRequest] 

Antwort

2

Mir persönlich gefällt Konstruktion mit Spiel. Vielleicht werden Sie es auch mögen

def doSomethingWithJsonRequest = Action(parse.json) { request => 
    request.body.validate[FooRequest] match { 
     case s: JsSuccess[FooRequest] => 
     Ok(processFoo(s.get)) 
     case e: JsError => 
     BadRequest(handleError(e)) 
    } 
} 
3

Statt as[T] Verwendung validate[T], die Sie ein JsResult[T] gibt. Es wird in der Play-Dokumentation here erklärt.

Von dort können Sie fold es und elegant das Problem behandeln. In der Regel möchte ich eine Zusammenfassung des Problems an den Anrufer als JSON senden, die viel besser ist als die "500 - Interner Serverfehler" HTML-Seite, die Sie erhalten, wenn Sie as[T] verwenden. Zumindest durch die Rückgabe eines 4xx Code anstelle einer 500, setzt es die Schuld auf die Aufrufer - es war sie, die uns ungültige JSON doch schickte!

Beispiel:

/** 
* You can use this method as the error 
* handler wherever you fold on a validate[T] 
*/ 
def handleBadJson(problems:Seq[(JsPath, Seq[ValidationError])]):Future[Result] = { 
    val jsProblems = problems.map { case(path, errs) => 
    val jsErrs = errs.map(err => JsString(err.message)) 
    path.toString -> JsArray(jsErrs) 
    } 

    Future.successful(BadRequest(JsObject(jsProblems))) 
} 

def doSomethingWithJsonRequest = Action.async(parse.json) { request => 
    request.body.validate[Foo].fold(handleBadJson, goodFoo => { 
    ... 
    }) 
}