Как работает запрос в Play Framework 2?

Должен сказать, я немного запутался в том, как обрабатывать параметр запроса с помощью новой Play Framework 2. Данные о том, как делается запрос, поступают из разных источников. На данный момент, вот возможности:

1 -Если вы делаете простой GET:

ctx().request().queryString()

2 -Если вы делаете POST с использованием формы HTML:

Форма:

<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>

Метод:

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();
}

Это кажется нормальный.

Теперь, если я добавлю@BodyParser.Of(BodyParser.Json.class)(предположим, что я принимаю как Ajax POST, так и обычный POST для отката в случае Non -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();
}

И тогда случился ад :Как я могу получить значения простой формы если ни один из них не заполнен (asJson, asFormUrlEncoded и т.д. )?!

3 -Если вы выполняете POST через AJAX:

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

Результат:

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();
}

С@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();
}

Здесь несоответствием является метод asJson(), который должен возвращать данные, поскольку согласно документу

Примечание :Таким образом, HTTP-ответ 400 будет автоматически возвращен для запросов, отличных от JSON.(http://www.playframework.org/documentation/2.0/JavaJsonRequests)

Что я хотел бы знать, так это то, что является лучшим декоратором + методом для POST, который будет принимать простое сообщение из HTML или запрос Ajax с POST?

9
задан i.am.michiel 25 April 2012 в 09:02
поделиться