2013-07-23 15 views
9

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

+0

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

+0

Tôi chỉ có tiêu đề yêu cầu như Julien đã nêu bên dưới – Nonos

+0

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

Trả lời

1

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

+0

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 –

+0

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

+13

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 –

-2

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.

+0

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

6

Đ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).

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

Hy vọng điều đó sẽ hữu ích.

+0

Đ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

+3

Liên kết đến tệp nguồn bị hỏng –

Các vấn đề liên quan