如何在电梯中记录请求/响应

时间:2012-05-30 16:15:33

标签: scala lift

我有一个电梯项目,其中
有一个类扩展RestHelper,看起来像这样

   serve{
        "api" / "mystuff" prefix {
         case a => ...
         case b => ...
          }
    }

如何在不将其添加到每个案例陈述的情况下记录所有请求(包括POST参数)和响应?

3 个答案:

答案 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.onBeginServicingLiftRules.onEndServicing

LiftRules.onBeginServicing.append {
  case r => println("Received: "+r)
}

LiftRules.onEndServicing.append {
    case (req, Full(resp)) => println("Responded: " + resp)
}