Мне нужно регистрировать запросы клиента akka http, а также их ответы. Несмотря на то, что, как представляется, существует API-интерфейс для регистрации этих запросов, нет четкой документации о том, как это сделать. Мой подход заключался в создании зарегистрированного запроса, который прозрачно обертывает Http().singleRequest(req)
следующим образом:
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
}
}
К сожалению, я должен захватить будущее либо через немаршаль, либо просто запросить resp.entity.dataBytes
, чтобы восстановить тело ответа. Я получаю регистрацию, но обещание завершается, и я больше не могу развязывать сущность с фактическими данными. Рабочее решение регистрирует запрос и ответ и передает этот тестовый пример без IllegalStateException
с броском "Promise уже завершено":
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
}
}
Идеи приветствуются.