2013-03-28 27 views
8

Ứng dụng web của tôi sẽ được kích hoạt từ một hệ thống bên ngoài. Nó sẽ gọi một đường dẫn yêu cầu của ứng dụng của tôi, nhưng sử dụng các tham số truy vấn khác nhau cho các loại yêu cầu khác nhau.Định tuyến dựa trên tham số truy vấn trong khung Chơi

Một trong các tham số là "hành động" xác định những việc cần làm. Phần còn lại của các tham số phụ thuộc vào "hành động".

Vì vậy, tôi có thể nhận được params yêu cầu như thế này:

action=sayHello&user=Joe 
action=newUser&name=Joe&address=xxx 
action=resetPassword 
... 

Tôi muốn để có thể mã hóa nó tương tự như trong file tuyến để chơi vì vậy nó param truy vấn dựa tuyến và càng nhiều các xác nhận các thông số khác càng tốt.

Điều tôi thay vào đó là một định tuyến cho tất cả các khả năng này với nhiều thông số tùy chọn. Việc xử lý hành động nó bắt đầu với một kết hợp mẫu lớn để thực hiện công văn và xác nhận tham số.

Googling and checking SO chỉ xuất hiện nhiều mẫu khi các tham số được mã hóa trong đường dẫn yêu cầu bằng cách nào đó, vì vậy nhiều đường dẫn được định tuyến đến cùng một hành động, nhưng tôi muốn ngược lại: một đường dẫn được chuyển đến các hành động khác nhau.

Một trong các đồng nghiệp của tôi cho biết chúng tôi có thể có một hành động "điều phối" sẽ chỉ chuyển hướng dựa trên thông số "hành động". Nó sẽ có cấu trúc hơn một chút sau đó là giải pháp hiện tại, nhưng nó sẽ không loại bỏ danh sách dài các thông số tùy chọn cần được chọn lọc cho hành động tiếp theo, vì vậy tôi hy vọng người ta biết một giải pháp tốt hơn :-)

BTW hệ thống bên ngoài gọi ứng dụng của tôi được phát triển bởi một công ty khác và tôi không có ảnh hưởng đến thiết kế này, do đó, nó không phải là một tùy chọn để thay đổi cách ứng dụng của tôi được kích hoạt.

Trả lời

6

Hành động điều phối đơn lẻ có lẽ là cách để đi và bạn không cần chỉ định tất cả các thông số tùy chọn của mình trong tuyến đường. Nếu action luôn luôn ở đó thì đó là người duy nhất bạn thực sự cần.

GET /someRoute  controller.dispatcher(action: String) 

Sau đó, trong phương thức hành động, bạn có thể truy cập request.queryString để nhận bất kỳ thông số tùy chọn nào khác.

3

Lưu ý: Tôi là NOT nhà phát triển Scala có kinh nghiệm, vì vậy có thể đoạn trích được hiển thị ... Điều quan trọng đối với bạn là hợp lệ và hoạt động.

Vậy ...

Bạn không cần phải khai báo tất cả các param tùy chọn trong file routes. Đó là phím tắt tuyệt vời để xác thực loại param và lựa chọn tốt nhất sẽ thuyết phục 'công ty khác' sử dụng API do bạn chuẩn bị ... Dù sao nếu bạn không có khả năng này, bạn cũng có thể xử lý các yêu cầu yêu cầu của mình.

Nói chung: các cách tiếp cận phối có vẻ là đúng ở nơi này, may mắn thay bạn không cần phải khai báo tất cả params tùy chọn trong routes và vượt qua nó giữa hành động/phương pháp vì chúng có thể được lấy trực tiếp từ yêu cầu.Trong PHP, nó có thể được so sánh với $_GET['action'] và trong phiên bản Java của bộ điều khiển Play 2 - DynamicForm lớp - form().bindFromRequest.get("action").

Hãy nói rằng bạn có một con đường:

GET  /dispatcher  controllers.Application.dispatcher 

Trong trường hợp đó hành động phối của bạn (và các phương pháp bổ sung) có thể trông giống như:

def dispatcher = Action { implicit request => 
    request.queryString.get("action").flatMap(_.headOption).getOrElse("invalid") match { 
     case "sayHello" => sayHelloMethod 
     case "newUser" => newUserMethod 
     case _   => BadRequest("Action not allowed!") 
    } 
} 

// http://localhost:9000/dispatcher?action=sayHello&name=John 
def sayHelloMethod(implicit request: RequestHeader) = { 
    val name = request.queryString.get("name").flatMap(_.headOption).getOrElse("") 
    Ok("Hello " + name) 
} 

// http://localhost:9000/dispatcher?action=newUser&name=John+Doe&[email protected] 
def newUserMethod(implicit request: RequestHeader) = { 
    val name = request.queryString.get("name").flatMap(_.headOption).getOrElse("") 
    val address = request.queryString.get("address").flatMap(_.headOption).getOrElse("") 
    Ok("We are creating new user " + name + " with address " + address) 
} 

Tất nhiên bạn sẽ cần phải xác nhận các loại và giá trị đến 'thủ công', đặc biệt là khi các hành động sẽ hoạt động trên DataBase, dù sao thì phần lớn nhất của sự cố bạn đã giải quyết ngay bây giờ.

+1

Gần 2 năm trôi qua sau câu trả lời của bạn. Có giải pháp nào tốt hơn trong khung chơi mới nhất không? – Ikrom

+0

@ Ikrom, tôi nghĩ rằng giải pháp tốt hơn giống như câu trả lời được chấp nhận, nhưng sử dụng một tham số tùy chọn: GET/someRoute controller.dispatcher (action: Option [String]) – faster2b

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