【问题标题】:How to apply filter on finch endpoint without using finagle filters?如何在不使用 finagle 过滤器的情况下在 finch 端点上应用过滤器?
【发布时间】:2018-10-30 21:50:35
【问题描述】:

我有多个端点。我可以使用 finagle 过滤器在端点上应用通用过滤器。但现在我想在特定端点上应用过滤器。 我怎样才能做到这一点?

【问题讨论】:

  • 您到底想做什么?在 99% 的情况下,您可以使用端点而不是过滤器。
  • @VladimirKostyukov 我有一个端点,我需要使用过滤器添加日志记录。您能分享一个端点过滤的示例吗?
  • 如果只是一个端点,可以在“端点主体”(即映射函数)中添加日志记录?
  • @VladimirKostyukov 在日志记录中我想记录我在请求和响应中收到的所有内容,包括 URL 和状态代码内容类型等。此数据在端点内不可用。
  • @VladimirKostyukov,对我建议的解决方案有何评论?我很想知道是否有更简单/更好的方法。

标签: finch


【解决方案1】:

我在玩redbubble's finch template 时出现了一个类似的问题(关于基本身份验证过滤),我通过以下方式部分解决了这个问题:

class AuthenticatedEndpoint[A](e: Endpoint[A]) extends Endpoint[A] { self =>

final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self)

final def apply(input: Input): Endpoint.Result[A] =
  if (checkSession(input.request)) {
    e(input)
  } else {
    // TODO return something meaningful to the caller (if possible?)
    EndpointResult.Skipped
  }
}

object AuthenticatedEndpoint {

  def validSession[A](e: Endpoint[A]): Endpoint[A] = new AuthenticatedEndpoint(e)

}

(如果请求一切顺利,checkSession 返回 true)。然后我的api定义为:

val api = "v1" :: loginApi :+: validSession(peopleApi :+: healthApi :+: adminApi)

这很有效,因为没有会话的请求将无法访问传递给validSession 的端点,但我还没有找到一种简单的方法来向调用者返回错误消息,我会很想知道我是否在这里选择了正确的道路。

【讨论】:

    【解决方案2】:

    这就是我解决它的方法。它可能并不理想,但很有效。

    class AuthenticatedEndpoint[A](e: Endpoint[A])(implicit auth: Request => Boolean) extends Endpoint[A] { self =>
    
      final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self)
    
      final def apply(input: Input): Endpoint.Result[A] =
        if (auth(input.request)) {
          e(input)
        } else {
          EndpointResult.Matched[Nothing](input, Rerunnable( Unauthorized(new Exception(s"Authentication Failed."))) )
        }
    }
    
    object AuthenticatedEndpoint {
    
      def validSession[A](e: Endpoint[A]): Endpoint[A] = new AuthenticatedEndpoint(e)
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多