Как использовать отфильтрованный сервис с RoutingService в Finagle
Честное предупреждение, я новичок в Scala, так что я мог упустить что-то простое здесь.
У меня есть этот код, он прекрасно работает
import java.net.InetSocketAddress
import com.twitter.finagle.builder.Server
import com.twitter.finagle.builder.ServerBuilder
import com.twitter.finagle.http.Http
import com.twitter.finagle.http.Request
import com.twitter.finagle.http.RichHttp
import java.util.logging.Logger
import com.typesafe.config.ConfigFactory
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.finagle.Service
import com.twitter.finagle.http.Response
import com.twitter.util.Future
import com.twitter.finagle.http.service.RoutingService
import org.jboss.netty.handler.codec.http.HttpResponse
import org.jboss.netty.handler.codec.http.HttpRequest
import com.twitter.finagle.SimpleFilter
object TestServer extends App {
val myService = new Service[Request, Response] {
def apply(request: Request) = {
// If you throw an exception here, the filter will catch it.
// throw new RuntimeException("s")
Future {
val response = Response()
response.setContent(copiedBuffer("Hello World", UTF_8))
response
}
}
}
val routingService = RoutingService.byPath {
case "/" => myService
}
val server: Server = ServerBuilder()
.codec(RichHttp[Request](Http()))
.bindTo(new InetSocketAddress(8080))
.name("httpserver")
.build(routingService)
println("Server is up.")
class Authorize extends SimpleFilter[HttpRequest, HttpResponse] {
def apply(request: HttpRequest, continue: Service[HttpRequest, HttpResponse]) = {
println("filtered")
continue(request)
}
}
}
Но я хочу добавить этот фильтр авторизации в мой сервис. Если я добавлю это:
val authorize = new Authorize
val aService: Service[HttpRequest, HttpResponse] = authorize andThen myService
Я получаю ошибку компиляции:
[error] found : com.twitter.finagle.Service[com.twitter.finagle.http.Request,com.twitter.finagle.http.Response]
[error] required: com.twitter.finagle.Service[org.jboss.netty.handler.codec.http.HttpRequest,org.jboss.netty.handler.codec.http.HttpResponse]
Если я изменю службу на тип Service[HttpRequest, HttpResponse], я не смогу использовать его routingService.
[error] found : com.twitter.finagle.Service[org.jboss.netty.handler.codec.http.HttpRequest,org.jboss.netty.handler.codec.http.HttpResponse]
[error] required: com.twitter.finagle.Service[?,com.twitter.finagle.http.Response]
Из-за этих ошибок типа мне трудно заставить службу маршрутизации работать с фильтрами.
Спасибо!
РЕДАКТИРОВАТЬ:
Я просто хотел добавить пример кода, работающего с использованием ответа @Septem ниже, используйте это для фильтра:
class Authorize extends Filter[Request, Response, Request, Response] {
def apply(request: Request, continue: Service[Request, Response]) = {
println("filtered")
continue(request)
}
}
Я все еще немного поморщился на finagle и scala, но я предполагаю, что здесь происходит то, что я использовал SimpleFilter, который уже предполагал службу определенного типа,
1 ответ
Почему вы используете разные типы запросов и ответов в вашем сервисе и фильтре?
ваш сервис использует запрос и ответ от finagle:
val myService = new Service[Request, Response]
но ваш фильтр использует запрос и ответ от netty:
class Authorize extends SimpleFilter[HttpRequest, HttpResponse]
Я думаю, что это причина ошибки компиляции, вы должны выбрать ту, которая удовлетворяет вашим потребностям, и придерживаться ее.
--редактировать--
тогда я думаю, что вы должны реализовать свою базу фильтров на Filter вместо SimpleFilter
abstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn] extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut])
Фильтр абстрактного класса позволяет преобразовывать типы запросов / ответов
проверьте документ для деталей