我需要记录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
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我必须通过解组或通过简单的请求来获取未来resp.entity.dataBytes,以便恢复响应的主体.我得到了日志记录但是承诺已经完成,我无法再将实体解组为实际数据.一个工作的解决方案将记录请求和响应并传递此测试用例,而IllegalStateException不会抛出"Promise already completed":
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
}
}
Run Code Online (Sandbox Code Playgroud)
想法欢迎.
我需要使用Akka的HTTP客户端(v2.0.2)来使用REST服务.逻辑方法是通过主机连接池执行此操作,因为我们期望大量的同时连接.在Flow此消耗(HttpRequest, T)和返回(Try[HttpResponse, T).该文件表明,一些任意类型T是需要管理的秩序回应潜在出请求,但没有指出什么主叫方应该使用返回的做T.
我的第一次尝试是使用Intas的下面的函数T.从许多地方调用它以确保连接使用单个池.
val pool = Http().cachedHostConnectionPool[Int]("127.0.0.1", 8888, ConnectionPoolSettings(system))
def pooledRequest(req: HttpRequest): Future[HttpResponse] = {
val unique = Random.nextInt
Source.single(req ? unique).via(pool).runWith(Sink.head).flatMap {
case (Success(r: HttpResponse), `unique`) ? Future.successful(r)
case (Failure(f), `unique`) ? Future.failed(f)
case (_, i) ? Future.failed(new Exception("Return does not match the request"))
}
}
Run Code Online (Sandbox Code Playgroud)
问题是客户应该如何使用它T?有更清洁更有效的解决方案吗?最后,我的偏执是否可能无法实现偏执?
我正在寻找一种优雅的方式来链接从公共基类型派生的部分函数。这个想法是每个部分函数处理一个类型,所以它们很容易为不同的类型组合,如果链式部分函数未定义,则它们有一个共同的包罗万象:
trait Message
trait SysMessage extends Message
trait UserMessage extends Message
case class TextSysMessage(m: String) extends SysMessage
case class TextUserMessage(m: String) extends UserMessage
class Test {
type MessagePF = scala.PartialFunction[Message, String]
type SysMessagePF = scala.PartialFunction[SysMessage, String]
type UserMessagePF = scala.PartialFunction[UserMessage, String]
def getSysMessage: SysMessagePF = {
case sm: TextSysMessage ? s"System message: ${sm.m}"
}
def getUserMessage: UserMessagePF = {
case um: TextUserMessage ? s"User message: ${um.m}"
}
def * : MessagePF = {
case m ? s"Unknown message: $m"
} …Run Code Online (Sandbox Code Playgroud) 如果Scala中有模式匹配(case),例如:
foo match {
case a: String => doSomething(a)
case f: Float => doSomethingElse(f)
case _ => ? // How does one determine what this was?
}
Run Code Online (Sandbox Code Playgroud)
有没有办法确定实际捕获的类型?