Ich versuche zu verstehen, wie die neue akka.http
-Bibliothek zu verwenden. Ich möchte eine HTTP-Anfrage an einen Server senden und den gesamten Antworttext als eine einzelne Zeichenfolge lesen, um eine Source[String,?]
zu erzeugen.Get ganze HttpResponse Körper als String mit Akka-Streams HTTP
Hier ist die beste Lösung, ich in der Lage war, so weit zu produzieren:
def get(
modelID: String,
pool: Flow[(HttpRequest,Int),(Try[HttpResponse],Int),Http.HostConnectionPool]
): Source[String,Unit] = {
val uri = reactionsURL(modelID)
val req = HttpRequest(uri = uri)
Source.single((req,0))
.via(pool)
.map {
case (Success(resp),_) =>
resp.entity.dataBytes.map(_.decodeString("utf-8"))
}.flatten(FlattenStrategy.concat)
.grouped(1024)
.map(_.mkString)
Es scheint gut zu funktionieren (mit Ausnahme des fehlenden Fehlerpfades), aber es ist ein bisschen klobig für solche einfache Aufgaben. Gibt es eine intelligentere Lösung? Kann ich die grouped
/ vermeiden?
OK. Aber ich brauche eine 'Source [String, Unit] ', weil ich weitere Transformationen anwenden muss. Mit deiner Lösung werde ich Materializer und ExecuctionContext weitergeben und dann alles in eine neue Quelle umwandeln ... Ist es nicht klirrender oder habe ich etwas übersehen? – paradigmatic
@paradigmatische Ich füge Beispiel hinzu. ExecutionContext und Materializer können als implizite Argumente festgelegt werden. – Zernike