2012-07-07 30 views
6

Tôi đang triển khai api trên web bằng cách sử dụng khung chơi scala 2.0.2. Tôi muốn trích xuất và xác nhận một số thông số nhận được. Và cho điều này tôi đang sử dụng một "hình thức" chơi cho phép tôi xác định các trường tùy chọn.Làm cách nào để xác định các trường tùy chọn giá trị mặc định trong biểu mẫu khung phát?

Sự cố: Đối với các trường tùy chọn đó, tôi cần xác định giá trị mặc định nếu thông số không được chuyển. Mã này được thiết kế để phân tích một cách chính xác những trường hợp này ba sử dụng:?

  • /kiểm tra đầu = abc (lỗi, abc không phải là một số nguyên)
  • /kiểm tra đầu = 123 (có giá trị, hàng đầu là 123)
  • /kiểm tra (có giá trị, hàng đầu là 42 (giá trị mặc định))

tôi đã đưa ra đoạn mã sau:

def test = Action { 
    implicit request => 

    case class CData(top:Int) 

    val p = Form(
    mapping(
     "top" -> optional(number) 
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top))) 
).bindFromRequest() 

    Ok("all done.") 
} 

Mã hoạt động, nhưng nó chắc chắn không thanh lịch. Có rất nhiều tấm nồi hơi đang diễn ra chỉ để thiết lập một giá trị mặc định cho một tham số yêu cầu bị thiếu.

Có ai có thể đề xuất giải pháp sạch hơn và hợp lý hơn không?

Trả lời

8

Đây là công việc định tuyến để xác thực tham số chuỗi truy vấn. Chỉ cần xác định thông số của bạn trong file routes:

GET /test controllers.Application.test(top: Int ?= 42) 

Và thêm top như một tham số để phương pháp điều khiển của bạn:

def test(top: Int) = Action { 
    // Use top here 
    val data = CData(top) 
} 

Sau đó, Play làm tất cả những việc chứng thực cho bạn. Lưu ý cách giá trị mặc định được chỉ định sử dụng cú pháp ?=.

Bạn chỉ nên sử dụng biểu mẫu cho yêu cầu POST.

Cập nhật:

Nếu bạn muốn tự kiểm tra các thông số, sau đó bạn có thể xác định phương pháp helper:

def getQueryParam(key: String, default: String)(implicit request: RequestHeader) = 
    request.queryString.get(key).flatMap(_.headOption).getOrElse(default) 

Và sử dụng nó bên trong các phương pháp điều khiển của bạn:

def test = Action { implicit request => 
    val top = getQueryParam("top", "42") 
    ... 

Nhưng bằng cách này bạn sẽ mất kiểm tra kiểu. Tất nhiên bạn có thể xác định người trợ giúp cho từng loại, tức là getIntParam, getStringParam, v.v. nhưng Play đã chứa triển khai bộ định tuyến an toàn, được thiết kế để giải quyết các vấn đề như vậy. Tôi khuyên bạn nên sử dụng cơ chế định tuyến thay vì kiểm tra thủ công.

+0

Giải pháp được đề xuất này hoạt động tốt. Nhược điểm duy nhất của giải pháp này không may là nó không quy mô tốt với một số lượng lớn các tham số mặc định. Khi bạn xây dựng một dịch vụ web/ứng dụng web phải hỗ trợ lọc danh sách, việc hiển thị tất cả các thông số mặc định trong tuyến đường có thể làm giảm khả năng đọc và độ mạnh của mã.Trong tất cả các kịch bản khác, đây thực sự là giải pháp ưa thích – natbusa

+1

Trả lời được cập nhật với triển khai phương pháp trợ giúp bạn có thể thấy hữu ích. – lambdas

+1

Tôi đã đề xuất một phần mở rộng cho khung chơi, để lập trình một cách tiếp cận hướng mã hơn về các tham số mặc định. Xem https://github.com/playframework/Play20/pull/381 – natbusa

12

trong Chơi 2,1

 
val p = Form(
    mapping(
     "top" -> default(number,42) 
    )(CData.apply)(CData.unapply) 
).bindFromRequest() 

sẽ làm những gì bạn muốn.

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