Должен сказать, что я немного смущен тем, как обрабатывать параметр запроса, используя новую 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 и обычную почту для запасного варианта в случае 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();
}
И потом, черт hapened: Как я могу получить значение а простая форма, если ни одна из них не заполнена (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()
метод, который должен возвращают данные, поскольку, согласно документу
Примечание: таким образом, 400 HTTP-ответ будет автоматически возвращен для запросов без JSON. (Http://www.playframework.org/documentation/2.0/JavaJsonRequests)
То, что я хотел бы знать, что это лучший декоратор + метод для POST, который будет принимать простую почту от HTML или запрос Ajax с POST?
Nice one! DynamicForm сделал мой день! Благодаря! –
Мне пришлось изменить 'form(). BindFromRequest()' to 'Form.form(). BindFromRequest()' – sissonb
Я получаю [NullPointerException: null] при выполнении: \t \t DynamicForm data = Form.form(). BindFromRequest () ;. – blee908