公平警告,我是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)
}
}
}
但是我想在我的服务中添加Authorize过滤器。如果我加上这个:
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],我就不能使用它来路由服务。
[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已经假设了某种类型的服务,
答案 0 :(得分:3)
为什么在服务和过滤器中使用不同的请求和响应类型?
您的服务正在使用来自finagle的请求和回复:
val myService = new Service[Request, Response]
但您的过滤器正在使用来自netty的请求和响应:
class Authorize extends SimpleFilter[HttpRequest, HttpResponse]
我认为这是恭维错误的原因,你必须选择一个满足你需要的,并坚持下去。
- 编辑 -
然后我认为您应该在过滤器而不是 SimpleFilter
上实施过滤器abstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn] extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut])
抽象类Filter允许您转换请求/响应类型
查看doc了解详情