Tengo que decir que estoy un poco confundido acerca de cómo manejar el parámetro de solicitud utilizando el nuevo Play Framework 2. Los datos provienen de diferentes orígenes con respecto a cómo se realiza la solicitud. Hasta ahora, he aquí las posibilidades:¿Cómo funciona la solicitud en Play Framework 2?
1 - Si lo hace un GET sencilla:
ctx().request().queryString()
2 - Si lo hace un POST utilizando un formulario HTML:
La forma:
<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>
El método:
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();
}
Esto parece normal.
Ahora si añado @BodyParser.Of(BodyParser.Json.class)
(supongo que aceptar tanto el Ajax y el poste normal de reserva en caso de no-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();
}
Y luego, demonios hapened: ¿Cómo puedo obtener los valores de una formulario simple si ninguno de ellos está lleno (como Json, asFormUrlEncoded, etc.)?
3 - Si lo hace un POST a través de AJAX:
// Code in JS used :
$.ajax({
'url': '/',
'dataType': 'json',
'type': 'POST',
'data': {'foo': 'bar', 't': 1, 'bool': true}
});
Resultado:
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();
}
Con la @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();
}
Aquí las inconsistencias es el método asJson()
que debe devolver los datos ya que, según el documento
Nota: De esta forma, se devolverá automáticamente una respuesta de 400 HTTP para solicitudes que no sean JSON. (Http://www.playframework.org/documentation/2.0/JavaJsonRequests)
Lo que me gustaría saber es cuál es el mejor método para decorador + un POST que aceptaría un puesto sencillo de HTML o una solicitud Ajax con POST?
¡Bonito! ¡DynamicForm hizo mi día! ¡Gracias! –
Tuve que cambiar 'form(). BindFromRequest()' a 'Form.form(). BindFromRequest()' – sissonb
Obtengo [NullPointerException: null] al realizar: \t \t DynamicForm data = Form.form(). BindFromRequest (); – blee908