2

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

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

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

4

3 回答 3

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 参数。

记录您使用的响应LiftRules.afterSend

更新:

使用 afterSend 您实际上可以访问请求和响应。

于 2012-05-30T17:44:06.147 回答
1

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 => ...
  }
}
于 2012-05-30T19:16:52.337 回答
0

根据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)
}
于 2016-05-27T13:53:44.647 回答