我正在使用cookie和基本身份验证的组合。在基本认证中,它需要一个功能
Option[UserPass] => Future[Option[T]]
并返回Directive[T]
。
我希望在cookie上创建一个带有函数的指令
HttpCookie => Future[T]
并返回Directive[T]
。
因此,我可以执行cookieAuth | basicAuth
的组合身份验证指令。
我能得到的最接近的是:
def myFunction:HttpCookie => Future[String]
val cookieAuth:Directive[String] = cookie("MyCookie").flatMap { cookie =>
onSuccess(myFunction(cookie))
}
但是签名不匹配。我得到了例外:
type mismatch;
found : spray.routing.Directive[shapeless.::[String,shapeless.HNil]]
required: spray.routing.Directive[String]
^
答案 0 :(得分:3)
tl; dr 生成Directive1[String]
类型的结果。
最初的问题是类型不匹配。纯Directive
特征采用类型参数,其上限为HList
,因此结果类型基于Shapeless的HList
Directive[String :: HNil]
。
在routing
声明的包对象中,分别为Directive[HNil]
和Directive[T :: HNil]
,Directive0
和Directive1[T]
输入alises。