2012-12-31 10 views
14

Sto usando jersey framework per sviluppare il servizio web RESTful. Sto gettando vari codici di stato HTTP con risposta utilizzando il codice seguente:come lanciare il codice di stato HTTP 204 usando il framework jersey nel servizio web RESTful?

public class RestNoContentException extends WebApplicationException 
{ 
    public RestNoContentException(String message) 
    { 
     super(Response.status(Status.NO_CONTENT) 
      .entity(message).type("text/plain") 
      .build()); 
     } 
} 

Durante il test il servizio web REST utilizzando Firefox Mozilla riposare strumento client, si stanno visualizzando 200 OK di stato invece di 204 NO CONTENT. Sto gestendo gli altri codici di stato nello stesso modo in cui sto facendo per il codice di stato 204. Altri codici di stato vengono visualizzati correttamente sullo strumento rest client, ma quando mostrare il codice di stato 204, viene visualizzato il codice di stato 200 OK.

Qualcuno, per favore, può darmi una mano qui? cosa mi sto perdendo?

risposta

11

Non si dovrebbe dare entità se si vuole buttare 204:

@GET 
@Produces(MediaType.TEXT_PLAIN) 
public Response test() { 
    //return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200 
    return Response.status(Status.NO_CONTENT).build(); 
} 
18

In primo luogo, è 204 nella categoria "successo" dei codici di risposta, in modo da restituirlo come il risultato di un'eccezione è molto, cosa molto strana da fare

Secondo, 204 significa "Nessun contenuto", ovvero la risposta non contiene alcuna entità, ma ne viene inserita una. È probabile che Jersey stia passando a 200 per te, che è fondamentalmente identico a un 204 tranne che contiene un'entità di risposta.

Infine, è possibile ottenere 204 risposte semplicemente con un paio di comportamenti incorporati: i metodi void e i valori di ritorno nulli sono entrambi associati a una risposta 204. In caso contrario, è sufficiente restituire Response.status(204).build().

8

Solo una cosa da aggiungere alle risposte già esistenti. Che cosa sta facendo Jersey è il correct behavior as for the spec:

3.3.3 Tipo restituito

metodi risorsa può tornare vuoto, di risposta, GenericEntity, o un altro tipo Java, questi tipi di ritorno sono associati a un corpo dell'entità risposta come segue:

vuoto Risultati in un corpo di entità vuoto con un codice di stato 204.

Risposta Risultati in un corpo entità mappato dalla proprietà entity della Response con il codice di stato specificato dalla proprietà status della Response. Un valore di ritorno nullo risulta in un codice di stato 204. Se la proprietà di stato della risposta non è impostata: un codice di stato 200 viene utilizzato per una proprietà di entità non nulla e viene utilizzato un codice di stato 204 se la proprietà dell'entità è null.

GenericEntity Risultati in un corpo entità mappato dalla proprietà Entity di GenericEntity. Se il valore restituito non è nullo, viene utilizzato un codice di stato 200, un valore di ritorno nullo risulta in un codice di stato 204.

Altro Risultati in un corpo dell'entità mappato dalla classe dell'istanza restituita. Se il valore restituito non è nullo, viene utilizzato un codice di stato 200, un valore di ritorno nullo risulta in un codice di stato 204.

[...]

E dal momento che si sta utilizzando un'eccezione, la seguente sezione si applica (sottolineatura mia):

3.3.4 Eccezioni

Metodo di risorse, il metodo sub-risorsa o sub -indicatore di risorse può lanciare qualsiasi eccezione verificata o deselezionata . Un'implementazione DEVE catturare tutte le eccezioni ed elaborarle come segue:

  1. Le istanze di WebApplicationException DEVONO essere associate a una risposta come segue. Se la proprietà di risposta dell'eccezione non contiene un'entità e un provider di mapping di eccezioni (vedere la sezione 4.4) è disponibile per WebApplicationException un'implementazione DEVE utilizzare il provider per creare una nuova istanza di risposta, in caso contrario la proprietà di risposta viene utilizzata direttamente . L'istanza di risposta risultante viene quindi elaborata in base alla sezione 3.3.3.

[...]

così si dovrebbe neanche restituire null, vuoto o costruire una risposta 204. Si generano eccezioni solo se si tratta di un caso eccezionale nella propria applicazione e si genera l'eccezione makes this clear.

+0

Ciao Ragazzi, grazie mille per la vostra risposta. –

Problemi correlati