请求如何在Play Framework 2中运行?

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请求?

Joh*_*uer 7

我建议使用PlayFramework提供的Form类.表单将其值绑定到提供的请求数据.

有两种不同的Form实现:

  1. DynamicForm:POST数据可通过Map访问器方法获得
  2. 表单: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)