2017-03-09 43 views
0

我有一个使用Spray Custom Directive0的路由处理器过滤器。全球过滤器从喷雾迁移到Akka-Http 2

此自定义指令的目的是构建一个请求过滤器来定时请求处理时间。

里面的自定义指令,我可以使用RequestContext的的功能withHttpResponseMapped采取的HttpResponse =>的HttpResponse的参数,withHttpResponseMapped会返回一个新的RequestContext对象,像这样:

def timeRequestInterval: Directive0 = { 
mapRequestContext { context => 
    val requestTimer = new RequestTimer(context.request) 
    context.withHttpResponseMapped { response => 
    requestTimer.stop() 
    response.mapEntity { entity => 
     entity 
    } 
    } 
} 

现在,我尝试从喷雾自定义指令迁移到阿卡-HTTP(2.4.8),但我无法找到HttpResponseMapped或RequestContext对象中可以接受“HttpResponse => HttpResponse”参数并返回新的RequestContext对象的任何函数。是否有任何支持的功能或方法可以帮助我解决Akka-Http迁移中的这个问题?

感谢您提前给予帮助。

回答

1

mapResponse指令是你在找什么,然后用flatMap而非apply结合指令:

val timeRequestInterval: Directive0 = extractRequestContext.flatMap { context => 
    val timer = new RequestTimer(context) 
    mapResponse { response => 
    timer.stop() 
    response 
    } 
} 
+0

谢谢你,约翰。它现在有效。非常感谢您的帮助。 Alan – Alan

+0

我在尝试一个非常类似的流程,而是得到以下错误: 'type mismatch; [error] found:akka.http.scaladsl.server.Directive [Unit] required:akka.http.scaladsl.server.RequestContext => scala.concurrent.Future [akka.http.scaladsl.server.RouteResult] extractRequestContext.flatMap { requestContext =>' – gregsilin