2017-03-09 28 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