2013-11-20 16 views
5

Tôi đang tái cấu trúc dự án để sử dụng Play Framework thay vì Scalatra và đang gặp sự cố với tham số truy vấn chứa dấu chấm phẩy, ví dụ: /url? Filter = filter1: val1; filter2: val2 được ánh xạ tới filter = "filter1: val1; filter2: val2" trong Scalatra, nhưng được ánh xạ tới filter = "filter1: val1" trong Play Framework. Giải pháp duy nhất tôi tìm thấy, Escape semicolon route playframework 2.0.2, đề xuất sử dụng regex để nắm bắt toàn bộ tham số, nhưng điều này dường như chỉ áp dụng cho tham số đường dẫn và không tham số truy vấn - một trong các yêu cầu của tôi là tôi không thể thay đổi cách giao diện người dùng gọi api, tức là tôi không thể thay đổi tham số truy vấn thành thông số đường dẫn.Chơi khung phân tích cú pháp dấu chấm phẩy trong tham số truy vấn

Tôi làm cách nào để yêu cầu Play không phân tích các dấu chấm phẩy trong các tham số truy vấn, tức là trả về "filter1; filter2" thay vì "filter1"?

Tôi có thể phân tích cú pháp tham số truy vấn bằng cách sử dụng regex trên "request.rawQueryString" theo cách thủ công, nhưng tôi muốn tránh điều này nếu có thể.

+0

Bạn đã bao giờ tìm thấy một giải pháp cho điều này? Chúng tôi đang gặp sự cố tương tự. – cdeszaq

+0

@cdeszaq Xem câu trả lời của tôi bên dưới –

Trả lời

3

Các giải pháp chúng tôi đã đi được để phân tích ra các tham số truy vấn sử dụng một lớp tiềm ẩn, mà đã không như phiền hà như tôi nghĩ rằng nó sẽ là

implicit class ParsedRawQueryString[+T](req: Request[T]) { 

    import java.net.URLDecoder.decode 

    def parsedRawQueryString = (for { 
    s <- decode(req.rawQueryString, "UTF-8").split('&') if s.contains('=') 
    } yield { 
    val index = s.indexOf('=') 
    s.substring(0, index) -> s.substring(index + 1) 
    }).toMap 
} 

def route = Action { 
    request => 
    val queryParams = request.parsedRawQueryString 
} 
Các vấn đề liên quan