Tôi đang cố gắng viết bộ lọc tương tự như bộ lọc được mô tả trong http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters nhưng tôi cần truy cập phần thân yêu cầu. Các tài liệu dưới đây nói rằng "khi chúng ta gọi tiếp theo, chúng ta lấy lại một Iteratee. Bạn có thể bọc nó trong một Enumeratee để thực hiện một số phép biến đổi nếu bạn muốn." Tôi đang cố gắng tìm ra cách quấn Iteratee để tôi có thể lấy phần thân yêu cầu dưới dạng một chuỗi trong bộ lọc để tôi có thể ghi lại nó.Bộ lọc Scala play http: cách tìm cơ thể yêu cầu
Trả lời
Tôi đã dành chút thời gian cho việc này. Tôi không có nghĩa là chuyên gia về Scala nhưng điều này hoạt động khá tốt! :)
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)
}
}
}
Kết quả cuối cùng sẽ in nội dung dưới dạng chuỗi Json (in đẹp).
Trong Play 2.1.x, phần tử giá trị không phải là thành viên của play.api.mvc.Result –
Tôi đang phát trên 2,2x http://www.playframework.com/documentation/2.2. x/api/scala/index.html # play.api.mvc.SimpleResult – Setheron
Tôi xin lỗi nhưng nội dung này sẽ in nội dung phản hồi của yêu cầu chứ không phải nội dung của yêu cầu –
Trong phương pháp điều khiển mà các tuyến đường để hành động, chỉ cần gọi
Map<String, String[]> params = request().queryString();
Điều này sẽ giúp bạn có được bản đồ về các thông số, nơi sau đó bạn có thể gọi
params.get("someParam")[0]
để có được những param (nếu nó là một giá trị duy nhất). Nếu param là một danh sách, bỏ qua chỉ mục và nó sẽ trả về một mảng.
Cảm ơn bạn đã trả lời nhưng tôi đang cố truy cập các tham số trong một bộ lọc toàn cầu cho tất cả các yêu cầu (tất cả các bộ điều khiển và hành động .. etc) vì vậy điều này sẽ không hoạt động. – Nonos
Điều đầu tiên bạn phải biết là khi Bộ lọc được gọi, phần thân yêu cầu chưa được phân tích cú pháp. Đó là lý do tại sao nó cung cấp cho bạn RequestHeader
. Bạn sẽ phải tìm ra loại cơ thể và gọi trình phân tích cú pháp cơ thể phù hợp.
Bạn có thể tìm thấy ví dụ về phân tích cú pháp nội dung trong bộ lọc CSRF (Bộ lọc CSRF có thể tra cứu mã thông báo CSRF trong byte đầu tiên của phần thân yêu cầu).
Hy vọng điều đó sẽ hữu ích.
Điều đó có vẻ khá hữu ích. Tôi chỉ cần chuyển đổi nội dung thành chuỗi để ghi nhật ký. Ứng dụng của tôi chủ yếu giao dịch với các yêu cầu GET hoặc POST với cơ thể JSON. – Nonos
Liên kết đến tệp nguồn bị hỏng –
- 1. Không tìm thấy tiêu đề yêu cầu WebSocket cơ bản Play 2.0
- 2. Xuân RestTemplate - http GET với yêu cầu cơ thể
- 3. Yêu cầu chuyển tiếp từ bộ lọc
- 4. Cách truy cập cơ quan yêu cầu HTTP bằng RestSharp?
- 5. Cách viết Yêu cầu HTTP
- 6. Cách lọc các yêu cầu trong Sinon
- 7. IIS - yêu cầu bị bộ lọc HTTP từ chối khi có char châu Âu trong url
- 8. Yêu cầu HTTP có xác thực cơ bản
- 9. không thể mở luồng: Yêu cầu HTTP không thành công! Yêu cầu Xấu HTTP/1.1 400
- 10. Yêu cầu DELETE HTTP
- 11. Tạo bộ lọc Gaussian chiều dài yêu cầu trong python
- 12. Cách biết Yêu cầu HTTP là BOT
- 13. Đặt tiêu đề HTTP trong Play 2.0 (scala)?
- 14. Tải trọng yêu cầu HTTP
- 15. HTTP Xóa với yêu cầu Cơ quan hành
- 16. Yêu cầu HTTP trong Ubuntu
- 17. Http Yêu cầu Vòng đời
- 18. Cách gửi yêu cầu thanh lọc trong véc ni
- 19. Hiểu vòng đời yêu cầu của Play! ứng dụng
- 20. yêu cầu http với powershell
- 21. Symfony2: gửi yêu cầu HTTP
- 22. Cách đăng nhập bằng http dây trong Play 2
- 23. Nhận giá trị tham số biểu mẫu từ yêu cầu trong bộ điều khiển Scala Play 2.0
- 24. Yêu cầu HTTP SOAP PHP
- 25. Độ dài nội dung của yêu cầu HTTP> kích thước cơ thể
- 26. Làm thế nào tôi có thể đăng nhập toàn bộ yêu cầu HTTP trong WAI/scotty?
- 27. Tiêu đề phạm vi Http yêu cầu toàn bộ tệp
- 28. Play Framework 2.1 Không thể xử lý yêu cầu JSON POST từ bộ điều khiển
- 29. Bộ lọc Servlet cho tất cả các yêu cầu
- 30. Gửi yêu cầu http trong node.js
Tôi không chắc chắn nếu tôi hiểu vấn đề, nhưng nếu bạn có yêu cầu sau đó nhận được cơ thể chỉ đơn giản là request.body ... – Jakob
Tôi chỉ có tiêu đề yêu cầu như Julien đã nêu bên dưới – Nonos
bạn có làm việc này không? Tôi cũng tò mò làm thế nào để làm điều này. – Setheron