我需要记录 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
}
}
不幸的是,我必须通过 unmarshal 或简单地请求来获取未来resp.entity.dataBytes
,以便恢复响应的主体。我得到了日志记录,但承诺已经完成,我不能再将实体解组为实际数据。一个可行的解决方案将记录请求和响应并通过此测试用例,而IllegalStateException
不会抛出“承诺已完成”:
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
}
}
欢迎提出想法。