Cyr*_* N. 9 json request playframework-2.0
我必须说我对如何使用新的Play Framework 2处理请求参数感到有些困惑.数据来自关于请求如何进行的不同来源.到目前为止,这里有可能性:
1 - 如果你做一个简单的GET:
ctx().request().queryString()
Run Code Online (Sandbox Code Playgroud)
2 - 如果使用HTML表单执行POST:
表格 :
<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>
Run Code Online (Sandbox Code Playgroud)
方法 :
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();
}
Run Code Online (Sandbox Code Playgroud)
这似乎很正常.
现在,如果我添加@BodyParser.Of(BodyParser.Json.class)(假设我在非JS案例中接受Ajax POST和普通POST for fallback):
@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();
}
Run Code Online (Sandbox Code Playgroud)
然后,地狱变得很糟糕:如果没有填充它们,我怎么能得到一个简单形式的值(asJson,asFormUrlEncoded等)?
3 - 如果您通过AJAX进行POST:
// Code in JS used :
$.ajax({
'url': '/',
'dataType': 'json',
'type': 'POST',
'data': {'foo': 'bar', 't': 1, 'bool': true}
});
Run Code Online (Sandbox Code Playgroud)
结果:
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();
}
Run Code Online (Sandbox Code Playgroud)
随着@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();
}
Run Code Online (Sandbox Code Playgroud)
asJson()根据文档,这里的不一致是应该返回数据的方法
注意:这样,对于非JSON请求,将自动返回400 HTTP响应.(http://www.playframework.org/documentation/2.0/JavaJsonRequests)
我想知道的是什么是POST的最佳装饰器+方法,它接受来自HTML的简单帖子或带有POST的Ajax请求?
我建议使用PlayFramework提供的Form类.表单将其值绑定到提供的请求数据.
有两种不同的Form实现:
表单:Form的通用形式将POST数据映射到实体类的实例[更多信息]
该表单还提供了一些有用的功能,如自动类型转换,验证,错误报告等.
一个动态形式的简单示例:
ajax请求:
$.post("@routes.Application.movetodo()",
{ "id": 123, "destination": destination }, function(data)
{
// do something when request was successfull
});
Run Code Online (Sandbox Code Playgroud)
路线文件:
GET / controllers.Application.index()
POST /movetodo controllers.Application.movetodo()
Run Code Online (Sandbox Code Playgroud)
控制器实现:
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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7935 次 |
| 最近记录: |