2016-03-29 19 views
7

Si supponga di aver impostato un complesso arbitrariamente Flow[HttpRequest, HttpResponse, Unit].akka-http: richiesta completa con flusso

posso utilizzano già detto flusso di gestire le richieste in arrivo con

Http().bindAndHandle(flow, "0.0.0.0", 8080) 

Ora vorrei aggiungere la registrazione, sfruttando qualche direttiva in vigore, come logRequestResult("my-service"){...} C'è un modo per combinare questa direttiva con il mio flusso? Immagino che sto cercando un'altra direttiva, qualcosa sulla falsariga di

def completeWithFlow(flow: Flow): Route 

È possibile?

N.B .: logRequestResult è un esempio, la mia domanda si applica a qualsiasi Direttiva che potrebbe essere utile.

+0

Perché la registrazione deve essere fornita da una direttiva? Perché non puoi semplicemente usare Flow.log? –

+0

Sì, potrei usare Flow.log per quell'esempio specifico. la mia domanda era un po 'più generica, come in: se ho una direttiva pronta all'uso che vorrei sfruttare, come posso riutilizzarla nel mio contesto? Diciamo che voglio gestire .favicon richieste sfruttando le direttive di seguito percorso ("favicon.ico") { getFromResource ("favicon.ico", 'image/x-icon') } Mi piacerebbe essere in grado di utilizzare questa direttiva in combinazione con il mio flusso, ad es usa il mio flusso per servire un percorso specifico e usa la direttiva sopra per servire/favicon. –

risposta

4

Risulta una (e forse l'unico) modo è quello di legare e materializzare un nuovo flusso, e alimentare la richiesta estratta ad esso. Esempio sotto

val myFlow: Flow[HttpRequest, HttpResponse, NotUsed] = ??? 

    val route = 
    get { 
     logRequestResult("my-service") { 
     extract(_.request) { req ⇒ 
      val futureResponse = Source.single(req).via(myFlow).runWith(Sink.head) 
      complete(futureResponse) 
     } 
     } 
    } 

    Http().bindAndHandle(route, "127.0.0.1", 9000) 
0

http://doc.akka.io/docs/akka/2.4.2/scala/http/routing-dsl/overview.html

Stai cercando route2HandlerFlow o Route.handlerFlow?

Credo che Route.handlerFlow funzionerà in base a implicit s.

es/

val serverBinding = Http().bindAndHandle(interface = "0.0.0.0", port = 8080, 
handler = route2HandlerFlow(mainFlow())) 
+0

Grazie, in realtà sto cercando il contrario. –

+1

:) Sempre felice di essere di aiuto ... a qualcuno ... forse –