2012-05-30 27 views
2

請求/響應我有一個電梯項目中
還有一類擴展RestHelper,看起來像這樣如何登錄電梯

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

我如何才能登錄所有的請求(包括POST參數)和沒有把它添加到每個病例陳述?

回答

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))) 
} 

注意網址參數保持不變。

要登錄響應您使用LiftRules.afterSend

UPDATE:

使用afterSend實際上你可以訪問請求和響應。

+0

我發現了,如果我使用LiftRules.afterSend的建議,我居然有機會獲得請求和響應,並從那裏 – user1207632

+0

很大登錄他們倆。我將更新與該信息的答案 –

1

服務和前綴方法各自採用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 => ... 
    } 
} 
+1

您贏得hack.me.lift獎 – user1207632

0

按在電梯食譜Debugging a Request,您可以使用LiftRules.onBeginServicingLiftRules.onEndServicing

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

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