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?
Đẹp nhất! DynamicForm đã làm cho ngày của tôi! Cảm ơn! –
Tôi phải thay đổi 'form(). BindFromRequest()' thành 'Form.form(). BindFromRequest()' – sissonb
Tôi nhận được [NullPointerException: null] khi thực hiện: \t \t DynamicForm data = Form.form(). BindFromRequest () ;. – blee908