你能解释一下为什么小修改会完全破坏我的路由吗?
我的路由很简单
val myRoutes =
pathPrefix("MainService") {
post {
requestInstance {
request =>
XmlBody {
(command, payload) =>
ifTrue2(command, "login") {
complete {
"Return something here"
}
} ~
ifTrue2(command, "serverInfo") {
complete {
"Return something here"
}
} ~
extractSession(payload) { // OLD VERSION WAS: myAuthorization {
session =>
complete {
"Return something here"
}
}
}
}
// Where custom directives look like this
def myAuthorization = entity(as[NodeSeq]).flatMap[Session :: HNil](
getSession(_) match {
case Some(session) => provide(session)
case None => reject(AuthorizationFailedRejection)
}
)
def extractSession(xmlPayload: ⇒ NodeSeq): Directive1[Session] =
getSession(xmlPayload) match {
case Some(session) => provide(session)
case None => reject(AuthorizationFailedRejection)
}
def ifTrue2(cmd : String, target : String): Directive0 =
new Directive0 {
def happly(func: HNil ⇒ Route) = {
if (cmd.equalsIgnoreCase(target))
func(HNil)
else
reject
}
}
def XmlBody = entity(as[NodeSeq]).flatMap[String :: Node :: HNil](
parseXmlRequest(_) match {
case Some(result) => hprovide(result)
case None => reject(BadXmlRejection("Bad XML body"))
}
)
def parseXmlRequest(xmlData: NodeSeq): Option[String :: Node :: HNil] = // body omitted for simplicity
def getSession(xmlRequest: NodeSeq): Option[Session] = // body omitted for simplicity
它支持两个未经身份验证的呼叫login
和serverInfo
. 所有其他请求必须在里面有 sessionId。
我在下面描述的情况发生在客户端仅发出一个登录请求时。
当我使用带有myAuthorization { }
. 但它不适用于extractSession(payload) { }
. myAuthorization
隐式地HttpEntity
作为输入。
最让我困惑的是,ifTrue2
即使它们没有改变,指令也停止了工作。在调试器中,我看到它IfTrue2
被调用了两次:使用("login", "login")
和("login", "serverInfo")
参数。
为什么它的工作方式不同?我该怎么做才能修复它?