2013-04-30 27 views
8

Hãy nói rằng tôi có một hành động mà tùy chấp nhận hai tham số:Xử lý các thông số URL GET freeform trong Chơi 2 tuyến

def foo(name: String, age: Integer) = Action { 
    // name & age can both be null if not passed 
} 

Làm thế nào để thiết lập route tập tin của tôi để làm việc với bất kỳ cú pháp gọi sau đây:

/foo 
/foo?name=john 
/foo?age=18 
/foo?name=john&age=18 
/foo?authCode=bar&name=john&age=18 // The controller may have other implicit parameters 

Cú pháp chính xác cho điều này là gì?

+0

Rất nhiều liên quan với http: // stackoverflow .com/questions/9657163/how-to-handle-optional-truy vấn-tham số-trong-play-framework –

Trả lời

17

Something như thế này nên làm việc:

GET /foo   controllers.MyController.foo(name: String ?= "", age: Int ?= 0) 

Kể từ khi thông số của bạn có thể được rời khỏi bạn cần cung cấp các giá trị mặc định cho họ (và xử lý những giá trị trong hàm điều khiển).

Bạn sẽ có thể truy cập vào các thông số tùy chọn khác trong bộ điều khiển nếu bạn vượt qua trong một yêu cầu tiềm ẩn và truy cập các thông số getQueryString (thêm vào trong Chơi 2.1.0 Tôi nghĩ rằng):

def foo(name: String, age: Integer) = Action { implicit request => 
    val authCode: Option[String] = request.getQueryString("authCode") 
    ... 
} 

Một cách để đẹp hơn làm điều đó chỉ có thể là để có tên và tuổi tùy chọn của bạn ra khỏi các thông số điều khiển và trích xuất tất cả mọi thứ từ QueryString:

def foo = Action { implicit request => 
    val nameOpt: Option[String] = request.getQueryString("name") 
    val ageOpt: Option[String] = request.getQueryString("age") 
    ... 
} 

cập nhật: các current docs cho 2.1.1 là một chút e về vấn đề này (từ cố định với vấn đề # 776) nhưng điều này là một (và, IMHO tốt nhất) tùy chọn:

GET /foo controllers.MyController.foo(name: Option[String], age: Option[Int]) 

Và ...

def foo(name: Option[String], age: Option[Int]) = Action { implicit request => 
    Ok(s"Name is: $name, age is $age") 
}