2012-04-25 35 views
9

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?

Respuesta

7

Recomendaría utilizar las clases de formulario proporcionadas por PlayFramework. El formulario vinculará sus valores a los datos de solicitud proporcionados.

Hay dos diferentes implementaciones Forma:

  1. DynamicForm: Datos Post está disponible a través de métodos Mapa descriptores de acceso de
  2. Forma: la forma genérica de la forma trazará un mapa de los datos POST a una instancia de una clase de entidad [more information]

    El formulario también proporciona algunas características útiles como la conversión de tipo automático, validación, informe de errores, etc.

un ejemplo sencillo con una forma dinámica: solicitud

ajax:

$.post("@routes.Application.movetodo()", 
    { "id": 123, "destination": destination }, function(data) 
     { 
      // do something when request was successfull 
     }); 

Rutas archivo: aplicación

GET /       controllers.Application.index() 
POST /movetodo     controllers.Application.movetodo() 

controlador:

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

¡Bonito! ¡DynamicForm hizo mi día! ¡Gracias! –

+1

Tuve que cambiar 'form(). BindFromRequest()' a 'Form.form(). BindFromRequest()' – sissonb

+1

Obtengo [NullPointerException: null] al realizar: \t \t DynamicForm data = Form.form(). BindFromRequest (); – blee908

0

La razón por la que asJson() estará vacío es que, de manera predeterminada, $ .ajax enviará una solicitud con un tipo de contenido establecido en 'application/x-www-form-urlencoded; charset = UTF-8 '. Debe configurarlo en 'application/json; charset = utf-8 ':

$.ajax({ 
    contentType: "application/json; charset=utf-8", 
    ... 
})