我有一个电梯项目,其中
有一个类扩展RestHelper,看起来像这样
serve{
"api" / "mystuff" prefix {
case a => ...
case b => ...
}
}
如何在不将其添加到每个案例陈述的情况下记录所有请求(包括POST参数)和响应?
答案 0 :(得分:2)
要记录请求,您可以使用LiftRules.statelessRewrite(在bootstrap.liftweb.Boot中):
LiftRules.statelessRewrite.append {
case RewriteRequest(ParsePath("api" :: key :: Nil, "", true, _), _, _) =>
log.info("REST: %s" format key)
RewriteResponse("api" :: key :: Nil,true)
}
将在以下休息服务器之前拦截:
case "api":: key :: Nil Get _ => {
val email = S.param("email") getOrElse {
"missing email parameter"
}
Full(PlainTextResponse("succeeded: %s, %s" format (key,email)))
}
请注意保留url params。
要记录您使用的回复LiftRules.afterSend
更新:
使用afterSend,您实际上可以访问请求和响应。
答案 1 :(得分:1)
每个服务和前缀方法都采用PartialFunction [Req,Box [LiftResponse]]。您没有直接使用这些类型,因为RestHelper为您提供了许多方便的方法和隐式转换,但您仍然可以直接访问Req。如果你只对登录“api”/“mystuff”前缀URL的访问感兴趣,那就很脏了,但我认为你可以这样做:
object Log {
def unapply(req: Req): Option[Boolean] = {
... code to log the request ....
None
}
}
serve{
"api" / "mystuff" prefix {
case Log(true) => //matching code will always be called but never match
case a => ...
case b => ...
}
}
答案 2 :(得分:0)
根据Lift Cookbook中的Debugging a Request,您可以使用LiftRules.onBeginServicing
和LiftRules.onEndServicing
:
LiftRules.onBeginServicing.append {
case r => println("Received: "+r)
}
LiftRules.onEndServicing.append {
case (req, Full(resp)) => println("Responded: " + resp)
}