oose
Komm am 21.06. auf unseren oose.campus zum perspectives.festival 🥳
DeutschDeutsch

Play2: Statusmeldungen in Json

Blog offline

Dieser Artikel stammt aus unserem Blog, der nicht mehr betreut wird. Für Neuigkeiten zu oose und interessante Inhalte zu unseren Themen, folgt uns gerne auf LinkedIn.

Bei der Programmierung von Webanwendungen gebe ich neben den Statuscode (200, ...) auch gerne eine kleine Json basierte Nachricht mit, die ggf. noch auf den Client ausgewertet oder angezeigt werden kann. Im einfachsten Fall ein etwas wie
{ "success" : "Aktualisierung erfolgreich" }
oder aber auch komplexere Datenstrukturen.

Der untenstehende Code zeigt, wie man so etwas endgültig in Scala für das Play2 Framework löst.
StatusMessage ist eine kleine Klasse, die einfach nur einen String Key hält, und irgendein Wert von Typ A. StatusMessage selbst hat diesen Typparameter im Context Bound Writes. Writes[A] ist das Play2 Interface, welches einen beliebigen Typen in Json konvertiert, und für die Statusmessage wird eben verlangt, dass dieser Typ der Statusmessage selbst auch in json konvertierbar sein muss.

Im Controller selbst kann man die Statusmessage Klasse dann wie folgt anwenden:
[code]
def ping = Action {
request =>
Ok(success( s"server ${request.host} is alive"))
}
[/code]

Weil dabei aber ein StatusMessage Objekt zurückgeben wird, welches Ok(...) nicht unmittelbar versteht, befinden sich im Companion Object von StatusMessage noch 2 implizite Definitionen, die eine StatusMessage automatisch in Json umwandeln. Und fertig ist schöner und selbstsprechender Code.

Diesen Code und andere kleine Utilities befinden sich im oose Maven Repository unter http://oose.github.io. Einige Erklärungen zu der Codebasis-In-Progress erfolgen noch hier im Blog. Bei Fragen ansonsten einfach eine email an mich.

[code]
package oose.play.json

import play.api.http._
import play.api.libs.json._
import play.api.libs.json.Json.toJsFieldJsValueWrapper
import play.api.mvc._

case class StatusMessage[A: Writes](key: String, value: A) {
def toJson(): JsValue = Json.obj(key -> Json.toJson(value))
}

object StatusMessage {

implicit def contentTypeOf_StatusMessage(implicit codec: Codec): ContentTypeOf[StatusMessage[_]] = {
ContentTypeOf[StatusMessage[_]](Some(ContentTypes.JSON))
}

implicit def writeableOf_StatusMessage(implicit codec: Codec): Writeable[StatusMessage[_]] = {
Writeable(sm => codec.encode(sm.toJson().toString))
}

def error[A: Writes](value: A) = StatusMessage("error", value)

def success[A: Writes](value: A) = StatusMessage("success", value)
}
[/code]