2012-04-25 28 views
9

Tôi phải nói rằng tôi hơi bối rối về cách xử lý thông số yêu cầu bằng cách sử dụng Khung chơi mới 2. Dữ liệu đến từ các nguồn gốc khác nhau về cách yêu cầu được thực hiện. Cho đến nay, đây là các khả năng:Yêu cầu hoạt động như thế nào trong Play Framework 2?

1 - Nếu bạn làm một GET đơn giản:

ctx().request().queryString() 

2 - Nếu bạn làm một POST sử dụng biểu mẫu HTML:

Hình thức:

<form method="post" action="/"> 
    <input type="hidden" name="foo" value="bar" /> 
    <input type="hidden" name="t" value="1" /> 
    <input type="hidden" name="bool" value="true" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

Phương thức:

public static Result test() { 
    ctx().request().queryString();    // {} ; As expected 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // contains data 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

Điều này có vẻ bình thường.

Bây giờ nếu tôi thêm @BodyParser.Of(BodyParser.Json.class) (cho rằng tôi chấp nhận cả hai Ajax POST và POST bình thường đối với dự phòng trong trường hợp không phải JS):

@BodyParser.Of(BodyParser.Json.class) 
public static Result test() { 
    ctx().request().queryString();    // {} ; as Expected 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // empty : Shouldn't this contains data since I posted them via a simple form ?! 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

Và sau đó, quái hapened: Làm thế nào tôi có thể nhận các giá trị của một hình thức đơn giản nếu không ai trong số họ được lấp đầy (asJson, asFormUrlEncoded, vv)?!

3 - Nếu bạn làm một POST qua AJAX:

// Code in JS used : 
$.ajax({ 
    'url': '/', 
    'dataType': 'json', 
    'type': 'POST', 
    'data': {'foo': 'bar', 't': 1, 'bool': true} 
}); 

Kết quả:

public static Result test() { 
    ctx().request().queryString();    // {} 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // contains data 
    ctx().request().body().asJson();   // empty 
    return ok(); 
} 

Với @BodyParser.Of(BodyParser.Json.class):

@BodyParser.Of(BodyParser.Json.class) 
public static Result test() { 
    ctx().request().queryString();    // {} 
    ctx().request().body();     // contains data 
    ctx().request().body().asFormUrlEncoded(); // empty 
    ctx().request().body().asJson();   // empty : Shouldn't this contains data since I espect JSON ?! 
    return ok(); 
} 

Ở đây, mâu thuẫn là phương pháp asJson() rằng nên trả lại dữ liệu từ, theo doc

Lưu ý: Bằng cách này, phản hồi HTTP 400 sẽ tự động được trả về cho các yêu cầu không phải JSON. (http://www.playframework.org/documentation/2.0/JavaJsonRequests)

Điều tôi muốn biết là phương pháp + trang trí tốt nhất cho POST có thể chấp nhận một bài đăng đơn giản từ HTML hoặc là gì một yêu cầu Ajax với POST?

Trả lời

7

Tôi khuyên bạn nên sử dụng các lớp Biểu mẫu do PlayFramework cung cấp. Biểu mẫu sẽ ràng buộc các giá trị của nó với dữ liệu yêu cầu được cung cấp.

Có hai triển khai mẫu khác nhau:

  1. DynamicForm: POST dữ liệu có sẵn thông qua các phương pháp Bản đồ accessors
  2. Mẫu: dạng chung của Form sẽ lập bản đồ dữ liệu POST để một thể hiện của một lớp thực thể [more information]

    Biểu mẫu cũng cung cấp một số tính năng hữu ích như chuyển đổi loại tự động, xác thực, báo cáo lỗi và v.v.

một ví dụ đơn giản với một hình thức năng động:

ajax yêu cầu:

$.post("@routes.Application.movetodo()", 
    { "id": 123, "destination": destination }, function(data) 
     { 
      // do something when request was successfull 
     }); 

Tuyến file:

GET /       controllers.Application.index() 
POST /movetodo     controllers.Application.movetodo() 

điều khiển thực hiện:

public static Result movetodo() 
{ 
    DynamicForm data = form().bindFromRequest(); // will read each parameter from post and provide their values through map accessor methods 
    // accessing a not defined parameter will result in null 
    String id = data.get("id"); 
    String destination = data.get("destination"); 

    return ok(); 
} 
+0

Đẹp nhất! DynamicForm đã làm cho ngày của tôi! Cảm ơn! –

+1

Tôi phải thay đổi 'form(). BindFromRequest()' thành 'Form.form(). BindFromRequest()' – sissonb

+1

Tôi nhận được [NullPointerException: null] khi thực hiện: \t \t DynamicForm data = Form.form(). BindFromRequest () ;. – blee908

0

Lý do asJson() sẽ trống là theo mặc định, $ .ajax sẽ gửi yêu cầu có loại nội dung được đặt thành 'application/x-www-form-urlencoded; charset = UTF-8 '. Bạn cần đặt nó thành 'ứng dụng/json; charset = utf-8 ':

$.ajax({ 
    contentType: "application/json; charset=utf-8", 
    ... 
}) 
Các vấn đề liên quan