5

Ho un'azione create in un gioco! controller di framework che dovrebbe restituire il codice di stato HTTP Created e reindirizzare il client nella posizione dell'oggetto creato.Restituisce lo stato HTTP "creato" in Play! Framework

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)); 
    } 
} 

Vedere anche method chaining in the Play! framework documentation.

Il codice sopra riportato restituisce il codice di stato 302 Found anziché 201 Created. Cosa posso fare per consentire a Play di restituire lo stato corretto (e l'intestazione Location)?

risposta

6

La ragione per cui questo sta accadendo è che, una volta creato il tuo qualcosa, stai dicendo di giocare a Show il tuo qualcosa, chiamando l'azione show.

Per raggiungere questo obiettivo, il gioco esegue un reindirizzamento (per mantenere il suo stato di riposo), per dire al browser che, a seguito della chiamata all'azione create(), deve ora reindirizzare all'azione show().

Quindi, hai un paio di opzioni.

  1. Non eseguire il rendering di una risposta e lasciare che il lato client gestisca dove va dopo averlo creato (non ideale).
  2. Invece di chiamare show(), semplicemente renderlo te nel metodo create() ...

di utilizzare l'opzione 2, esso può apparire come il seguente: codice di

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

'201 Created' devono essere inviate insieme ad un colpo di testa' location' che non sarebbe successo con la soluzione 2. Potrebbe spiegare la soluzione 1, non capisco vero? – deamon

+0

La soluzione 1 non è buona. In pratica si dice, dopo che la richiesta è stata creata, quindi richiesta show(), quindi il tuo flusso è deciso lato client (cioè javascript), piuttosto che serveride nella tua azione. – Codemwnci

+3

Ho controllato il codice sorgente per Play (1.2.3) e l'oggetto Redirect, ha un codice, che è predefinito a 302. Ha un costruttore per offrire un codice diverso, ma questo costruttore non sembra essere usato nel struttura. – Codemwnci

1

Esempio per impostare il codice di stato in Play framework: Response.current(). status = Http.StatusCode.CREATED;

0

Nel framework di gioco, chiamare un'altra azione esegue un reindirizzamento tranne che l'azione chiamata non è pubblica. Così, qui è una delle soluzioni:

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)); 
    } 
}