Должен сказать, я немного запутался в том, как обрабатывать параметр запроса с помощью новой 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?