我想寫一個類似於http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters中描述的簡單過濾器,但我需要訪問請求正文。下面的文檔指出:「當我們接下來調用時,我們得到一個Iteratee,如果你願意的話,你可以把它封裝在Enumeratee中做一些轉換。」我想弄清楚如何包裝Iteratee,以便我可以將請求主體作爲過濾器中的字符串來獲取,以便我可以將其記錄下來。斯卡拉播放http過濾器:如何找到請求主體
回答
我花了一些時間在這個。 我不是一個斯卡拉專家,但這工作得很好! :)
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字符串(漂亮打印)。
在Play 2.1.x中,value body不是play.api.mvc.Result的成員 –
我在Play 2.2x上http://www.playframework.com/documentation/2.2。 x/api/scala/index.html#play.api.mvc.SimpleResult – Setheron
很抱歉,這會將響應的正文打印到請求中,而不是請求的正文 –
在控制器方法路線的動作,只需撥打
Map<String, String[]> params = request().queryString();
這將讓你圖的參數中,在那裏你可以調用
params.get("someParam")[0]
得到參數(如果它是一個單一的值)。如果param是一個列表,忽略索引並返回一個數組。
感謝您的回覆,但我試圖訪問所有請求(所有控制器和操作..等等)的全局過濾器中的參數,所以這不起作用。 – Nonos
你必須知道的第一件事是當Filter被調用時,請求主體尚未被解析。這就是爲什麼它給你一個RequestHeader
。您必須找出正文的類型,並相應地調用正確的正文解析器。
您可以在CSRF過濾器(它可以在請求主體的第一個字節中查找CSRF令牌)中找到正文解析的示例。
希望它有幫助。
這似乎很有幫助。爲了記錄目的,我只需要將主體轉換爲字符串。我的應用程序主要處理GET請求或POST與JSON正文。 – Nonos
源文件的鏈接已損壞 –
- 1. 斯卡拉播放2.1:訪問請求和響應機構在過濾器
- 2. 在斯卡拉發送HTTP請求
- 3. 如何在到達服務器之前基於主體過濾HTTP請求?
- 4. 斯卡拉播放2,傳遞請求方法
- 5. 斯卡拉/播放:javax.xml.soap中的請求頭Content-Type的問題
- 6. 播放/斯卡拉:在ActionBuilder
- 7. 併發播放斯卡拉
- 8. 斯卡拉:播放 - 以JSON
- 9. 如何處理JSON有效載荷在用GET請求播放2.0 +斯卡拉
- 10. 過濾從斯卡拉
- 11. 斯卡拉過濾器和打印類
- 12. EitherT過濾器錯誤斯卡拉
- 13. 斯卡拉流過濾器行爲
- 14. 找到斯卡拉
- 15. 如何通過額外的表單數據斯卡拉播放
- 16. 轉換RDF4J流過濾器(拉姆達?)從Java到斯卡拉
- 17. 斯卡拉播放模板:反轉與HTTP POST路由
- 18. 斯卡拉JSON在讀取播放2.1.1
- 19. 斯卡拉播放地圖表格
- 20. 播放框架(斯卡拉)模板
- 21. JSON格式與播放2.4 /斯卡拉
- 22. 斯卡拉特質在播放
- 23. 斯卡拉播放框架在驗證
- 24. 播放2.1 - 與SimpleResult(斯卡拉)
- 25. JsPath在斯卡拉播放Json
- 26. 播放斯卡拉油滑交易
- 27. 斯卡拉播放框架和NIO.2
- 28. 播放 - 與Java的斯卡拉模板
- 29. 斯卡拉 - 使用播放JSON
- 30. 我將如何實現攔截器/過濾器在播放框架2.4.3(斯卡拉)
林不知道如果我明白這個問題,但如果你有請求,然後得到的身體只是request.body ... – Jakob
我只有請求標題朱利安陳述如下 – Nonos
你是否得到這個工作?我也很好奇如何做到這一點。 – Setheron