2013-07-23 13 views
9

我想寫一個類似於http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters中描述的簡單過濾器,但我需要訪問請求正文。下面的文檔指出:「當我們接下來調用時,我們得到一個Iteratee,如果你願意的話,你可以把它封裝在Enumeratee中做一些轉換。」我想弄清楚如何包裝Iteratee,以便我可以將請求主體作爲過濾器中的字符串來獲取,以便我可以將其記錄下來。斯卡拉播放http過濾器:如何找到請求主體

+0

林不知道如果我明白這個問題,但如果你有請求,然後得到的身體只是request.body ... – Jakob

+0

我只有請求標題朱利安陳述如下 – Nonos

+0

你是否得到這個工作?我也很好奇如何做到這一點。 – Setheron

回答

1

我花了一些時間在這個。 我不是一個斯卡拉專家,但這工作得很好! :)

object AccessLog extends EssentialFilter { 
    def apply(nextFilter: EssentialAction) = new EssentialAction { 
    def apply(requestHeader: RequestHeader) = { 
     val startTime = System.currentTimeMillis 

     nextFilter(requestHeader).map { result => 
     val endTime = System.currentTimeMillis 
     val requestTime = endTime - startTime 

     val bytesToString: Enumeratee[ Array[Byte], String ] = Enumeratee.map[Array[Byte]]{ bytes => new String(bytes) } 
     val consume: Iteratee[String,String] = Iteratee.consume[String]()  
     val resultBody : Future[String] = result.body |>>> bytesToString &>> consume 

     resultBody.map { 
      body => 
      Logger.info(s"${requestHeader.method} ${requestHeader.uri}" + 
      s" took ${requestTime}ms and returned ${result.header.status}") 
      val jsonBody = Json.parse(body) 
      Logger.debug(s"Response\nHeader:\n${result.header.headers.toString}\nBody:\n${Json.prettyPrint(jsonBody)}") 
     } 

     result.withHeaders("Request-Time" -> requestTime.toString) 

     } 
    } 
    } 

最終結果將打印身體作爲JSON字符串(漂亮打印)。

+0

在Play 2.1.x中,value body不是play.api.mvc.Result的成員 –

+0

我在Play 2.2x上http://www.playframework.com/documentation/2.2。 x/api/scala/index.html#play.api.mvc.SimpleResult – Setheron

+13

很抱歉,這會將響應的正文打印到請求中,而不是請求的正文 –

-2

在控制器方法路線的動作,只需撥打

Map<String, String[]> params = request().queryString(); 

這將讓你圖的參數中,在那裏你可以調用

params.get("someParam")[0] 

得到參數(如果它是一個單一的值)。如果param是一個列表,忽略索引並返回一個數組。

+0

感謝您的回覆,但我試圖訪問所有請求(所有控制器和操作..等等)的全局過濾器中的參數,所以這不起作用。 – Nonos

6

你必須知道的第一件事是當Filter被調用時,請求主體尚未被解析。這就是爲什麼它給你一個RequestHeader。您必須找出正文的類型,並相應地調用正確的正文解析器。

您可以在CSRF過濾器(它可以在請求主體的第一個字節中查找CSRF令牌)中找到正文解析的示例。

參見:https://github.com/playframework/playframework/blob/master/framework/src/play-filters-helpers/src/main/scala/csrf.scala#L221-L233

希望它有幫助。

+0

這似乎很有幫助。爲了記錄目的,我只需要將主體轉換爲字符串。我的應用程序主要處理GET請求或POST與JSON正文。 – Nonos

+3

源文件的鏈接已損壞 –