Для ясности давайте начнем с явного указания всех возвращаемых типов:
val iqServiceFlow: Flow[HttpRequest, HttpResponse, Any] = ...
val firstFlow: Flow[HttpRequest, HttpResponse, NotUsed] = Route.handlerFlow(firstRoutes)
val lastFlow: Flow[HttpRequest, HttpResponse, NotUsed] = Route.handlerFlow(lastRoutes)
Кроме того, вместо ...
val handler = firstRoutes via iqServiceFlow via lastFlow
... вы, вероятно, имели в виду:
val handler = firstFlow via iqServiceFlow via lastFlow
Чтобы объединить потоки вместе с via
, типы входа и выхода должны совпадать: то есть тип вывода первого потока должен совпадать с типом ввода второго потока, искоро.То, что вы пытаетесь сделать со своим обработчиком, таково:
[HttpRequest, HttpResponse] // firstFlow
|
v
[HttpRequest, HttpResponse] // iqServiceFlow
|
v
[HttpRequest, HttpResponse] // lastFlow
Тип вывода всех ваших потоков HttpResponse
, но все их соответствующие типы ввода HttpRequest
, поэтому вы не можете связатьих вместе с via
.
Чтобы связать ваши потоки, вам нужна функция, которая каким-то образом преобразует HttpResponse
в HttpRequest
:
val respToReq: HttpResponse => HttpRequest = ...
. Вы можете создать поток извышеупомянутая функция:
val convertingFlow: Flow[HttpResponse, HttpRequest] = Flow.fromFunction(respToReq)
Теперь вы можете объединить свои потоки в цепочку:
val handler = firstFlow via convertingFlow via iqServiceFlow via convertingFlow via lastFlow
Типы выровнены следующим образом:
[HttpRequest, HttpResponse] // firstFlow
|
v
[HttpResponse, HttpRequest] // convertingFlow
|
v
[HttpRequest, HttpResponse] // iqServiceFlow
|
v
[HttpResponse, HttpRequest] // convertingFlow
|
v
[HttpRequest, HttpResponse] // lastFlow
Выше предполагается, что вы можетеповторно использовать ту же функцию преобразования / поток.Если это предположение не выполняется, очевидно, вы можете создавать различные функции / потоки преобразования.