5

¡Tengo una acción create en un juego! Controlador de marco que debe devolver el código de estado HTTP Created y redirigir al cliente a la ubicación del objeto creado.Devuelve el estado de HTTP "creado" en Play! Marco

public class SomeController extends Controller { 

    public static void create() { 
     Something something = new Something(); 
     something.save(); 
     response.status = StatusCode.CREATED; // Doesn't work! 
     show(something.id); 
    } 

    public static void show(long id) { 
     render(Something.findById(id)); 
    } 
} 

Véase también method chaining in the Play! framework documentation.

El código anterior devuelve el código de estado 302 Found en lugar de 201 Created. ¿Qué puedo hacer para que Play devuelva el estado correcto (y el encabezado Location)?

Respuesta

6

La razón por la que esto sucede, es que una vez que creaste algo, estás diciendo play a Show algo, llamando a la acción show.

Para lograr esto, el juego se está realizando una redirección (para mantener su estado de reposo), para decirle al navegador que como resultado de llamar a la acción create(), ahora se debe redirigir a la acción show().

Entonces, usted tiene un par de opciones.

  1. No genere una respuesta, y deje que el lado del cliente se encargue de dónde va después de crearlo (no es ideal).
  2. lugar de llamar a show(), sólo tiene que hacer usted mismo en el método create() ...

la opción 2 de usar, que puede ser similar al siguiente: Código

public static void create() { 
    Something something = new Something(); 
    something.save(); 
    response.status = StatusCode.CREATED; 
    renderTemplate("Application/show.html", something); 
} 
+1

'201 Created' debe enviar junto con una cabecera' Location' lo que no sucedería con solución 2. ¿Podría explicar la solución 1, que no entiendo ¿eso? – deamon

+0

La solución 1 no es buena. Básicamente se trata de decir, después de crear su solicitud, luego solicitar show(), por lo que su flujo se decide desde el lado del cliente (es decir, javascript), en lugar de desde el servidor en su acción. – Codemwnci

+3

He comprobado el código fuente para Play (1.2.3) y el objeto Redirect, tiene un código, que está predeterminado en 302. Tiene un constructor para ofrecer un código diferente, pero este constructor no parece ser utilizado en el marco de referencia. – Codemwnci

1

Ejemplo para configurar el código de estado en Play framework: Response.current(). status = Http.StatusCode.CREATED;

0

En el marco de juego, al llamar a otra acción se realiza una redirección, excepto que la acción llamada no es pública. lo tanto, aquí es una de las soluciones:

public class SomeController extends Controller { 

    public static void create() { 
     Something something = new Something(); 
     something.save(); 
     response.status = StatusCode.CREATED; // Doesn't work! 
     show(something.id); 
    } 

    private static void show(long id) { 
     render(Something.findById(id)); 
    } 
} 
Cuestiones relacionadas