2016-08-23 4 views
0

Ich bekomme einen Json-Feed zurück von einem entfernten Dritten API auf diese Weise:Akka: Wie mit zurück Json-Feed arbeiten?

val myjson: Future[HttpResponse] = http.singleRequest(HttpRequest(uri = encodedUri)) 

myjson onComplete { 
    case Success(response) => sender ! WrappedResponse(response.entity.toJson) 
    case Failure... 
} 

Fallklasse WrappedResponse (Antwort: JsValue)

Die HttpResponse.entity enthält meinen Json-Feed. Ist es möglich, Marshall und Marshall dieses JSon oder nur Teile davon zu füttern?

Eines der Probleme ist, dass, wenn ich es wieder die json in einem Fall, Klasse eingewickelt senden ich etwas bekommen:

Error:(38, 78) Cannot find JsonWriter or JsonFormat type class for akka.http.scaladsl.model.ResponseEntity 
     case Success(response) => sender ! WrappedResponse(response.entity.toJson) 

Wie kann ich „marshall“ Json selbst?

UPDATE

ich endlich erste auf diese Weise die Daten entordnen:

val responseData = sendHttpRequest(encodedUrl) 
     val bodyAsString = responseData.flatMap { response => Unmarshal(response.entity).to[String] } 

     bodyAsString onComplete { 
     case Success(body) => sender ! WrappedResponse(body) 
     case Failure(response) => response 
     } 

und in meinem Einweiser:

trait MyJsonMarshaller extends SprayJsonSupport with DefaultJsonProtocol { 

    implicit val titleDeedResponseFormat = jsonFormat1(WrappedResponse.apply) 

} 

aber die "re-apply" Rangier funktioniert nicht

Antwort

0

Sure! Dies ist nicht getestet und von Code in meinem eigenen Projekt angepasst, aber man könnte so etwas wie zu tun:

import akka.http.scaladsl.unmarshalling.Unmarshal 

val myResponse: Future[HttpResponse] = http.singleRequest(HttpRequest(uri = encodedUri)) 

val jsonFut = myResponse.flatMap { 
    case HttpResponse(StatusCodes.OK, _, entity, _) => 
    Unmarshal(entity).to[JsObject] 
    case other => 
    logger.debug(s"Failed response: $other") 
    throw new Exception(other.toString()) 
}.recover { 
    // ... error handling 
} 

In diesem Fall müssen Sie mit dem JsObject Ergebnis in einer Ad-hoc-Weise beschäftigen würden. Aber wenn Sie JsonFormat Instanzen für Domain-Modellklassen definieren, können Sie direkt auf Domänenobjekte entordnen.

+0

Was meinst du mit "erneut anwenden" Marshalling? Tritt ein Compilerfehler auf? – acjay

+0

Nein, ich habe es gelöst. Ich muss mich nicht erneut bewerben. – Randomize