Sto cercando di capire come utilizzare la nuova libreria akka.http
. Vorrei inviare una richiesta http a un server e leggere l'intero corpo della risposta come una singola stringa per produrre un Source[String,?]
.Ottieni l'intero corpo HttpResponse come una stringa con Akka-Streams HTTP
Ecco la soluzione migliore sono stato in grado di produrre fino ad ora:
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)
Sembra funzionare bene (tranne il percorso di errore mancante), ma è un po 'goffo per tali compiti semplici. C'è una soluzione più intelligente? Posso evitare lo grouped
/mkString
?
OK. Ma ho bisogno di un 'Source [String, Unit] perché ho ulteriori trasformazioni da applicare. Con la tua soluzione, avrò bisogno di passare lungo Materializer ed ExecuctionContext e poi riavvolgere eveything in una nuova Sorgente ... Non è più clunkier o mi sono perso qualcosa? – paradigmatic
@paradigmatic Aggiungo un esempio. ExecutionContext e materializer potrebbero essere impostati come argomenti impliciti. – Zernike