JAX-RS - Come restituire JSON e il codice di stato HTTP insieme?

Sto scrivendo una web app REST (NetBeans 6.9, JAX-RS, TopLink Essentials) e cercando di restituire JSON e codice di stato HTTP. Ho del codice pronto e funzionante che restituisce JSON quando il metodo HTTP GET viene chiamato dal client. Essenzialmente:

@Path("get/id")
@GET
@Produces("application/json")
public M_機械 getMachineToUpdate(@PathParam("id") String id) {

    // some code to return JSON ...

    return myJson;
}

Ma voglio anche restituire un codice di stato HTTP (500, 200, 204, ecc.) insieme ai dati JSON.

Ho provato a usare HttpServletResponse:

response.sendError("error message", 500);

Ma questo ha fatto sì che il browser pensasse che si trattasse di un "vero" 500, quindi la pagina web in uscita era una normale pagina di errore HTTP 500.

Voglio restituire un codice di stato HTTP in modo che il mio JavaScript lato client possa gestire una logica che dipende da esso (ad esempio per visualizzare il codice di errore e il messaggio su una pagina HTML). È possibile o i codici di stato HTTP non dovrebbero essere usati per queste cose?

Soluzione

Ecco un esempio:

@GET
@Path("retrieve/{uuid}")
public Response retrieveSomething(@PathParam("uuid") String uuid) {
    if(uuid == null || uuid.trim().length() == 0) {
        return Response.serverError().entity("UUID cannot be blank").build();
    }
    Entity entity = service.getById(uuid);
    if(entity == null) {
        return Response.status(Response.Status.NOT_FOUND).entity("Entity not found for UUID: " + uuid).build();
    }
    String json = //convert entity to json
    return Response.ok(json, MediaType.APPLICATION_JSON).build();
}

Dai un'occhiata alla classe Response.

Si noti che si dovrebbe sempre specificare un tipo di contenuto, specialmente se si stanno passando più tipi di contenuto, ma se ogni messaggio sarà rappresentato come JSON, si può semplicemente annotare il metodo con @Produces("application/json")

Commentari (4)

JAX-RS ha il supporto per codici HTTP standard/personalizzati. Vedere ResponseBuilder e ResponseStatus, per esempio:

http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/core/Response.ResponseBuilder.html#status%28javax.ws.rs.core.Response.Status%29

Tenete a mente che le informazioni JSON riguardano più i dati associati alla risorsa/applicazione. I codici HTTP sono più sullo stato dell'operazione CRUD richiesta. (almeno è così che dovrebbe essere nei sistemi REST-ful)

Commentari (1)

Non sto usando JAX-RS, ma ho uno scenario simile dove uso:

response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
Commentari (2)