我有一个电梯项目,其中
有一个扩展 RestHelper 的类,看起来像这样
serve{
"api" / "mystuff" prefix {
case a => ...
case b => ...
}
}
如何在不将其添加到每个案例语句的情况下记录所有请求(包括 POST 参数)和响应?
要记录请求,您可以使用 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 参数。
记录您使用的响应LiftRules.afterSend
更新:
使用 afterSend 您实际上可以访问请求和响应。
serve 和 prefix 方法都采用 PartialFunction[Req, Box[LiftResponse]]。您没有直接使用这些类型,因为 RestHelper 为您提供了许多方便的方法和隐式转换,但您仍然可以直接访问 Req。如果您只对记录对“api”/“mystuff”前缀 URLS 的访问感兴趣,那很脏,但我认为您可以这样做:
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 => ...
}
}
根据Lift Cookbook 中的调试请求LiftRules.onBeginServicing
,您可以使用and LiftRules.onEndServicing
:
LiftRules.onBeginServicing.append {
case r => println("Received: "+r)
}
LiftRules.onEndServicing.append {
case (req, Full(resp)) => println("Responded: " + resp)
}