Devo registrare le richieste del client HTTP di akka e le relative risposte. Mentre sembra esserci un suggerimento di API per la registrazione di queste richieste, non esiste una documentazione chiara su come dovrebbe essere fatto. Il mio approccio è stato quello di creare una richiesta di login che avvolge in modo trasparente Http().singleRequest(req)
come segue:Come si accede a un client HTTP Akka richiede
def loggedRequest(req: HttpRequest)
(implicit system: ActorSystem, ctx: ExecutionContext, m: Materializer): Future[HttpResponse] = {
Http().singleRequest(req).map { resp ⇒
Unmarshal(resp.entity).to[String].foreach{s ⇒
system.log.info(req.toString)
system.log.info(resp.toString + "\n" + s)
}
resp
}
}
Purtroppo, devo afferrare il futuro sia attraverso il unmarshal o semplicemente richiedendo resp.entity.dataBytes
al fine di recuperare il corpo della risposta. Ottengo il logging ma la promessa viene completata e non riesco più a distinguere l'entità dai dati reali. Una soluzione di lavoro potrebbe registrare la richiesta e risposta e passare questo banco di prova senza un IllegalStateException
con "promessa già completato" essere gettato:
describe("Logged rest requests") {
it("deliver typed responses") {
val foo = Rest.loggedRequest(Get(s"http://127.0.0.1:9000/some/path"))
val resp = foo.futureValue(patience)
resp.status shouldBe StatusCodes.OK
val res = Unmarshal(resp.entity).to[MyClass].futureValue
}
}
Idee benvenuto.
Sto provando a fare lo stesso. Hai trovato una soluzione? –