Estoy escribiendo una aplicación web REST (NetBeans 6.9, JAX-RS, TopLink Essentials) y tratando de devolver JSON y código de estado HTTP. Tengo código listo y funcionando que devuelve JSON cuando el método HTTP GET es llamado desde el cliente. Esencialmente:
@Path("get/id")
@GET
@Produces("application/json")
public M_機械 getMachineToUpdate(@PathParam("id") String id) {
// some code to return JSON ...
return myJson;
}
Pero también quiero devolver un código de estado HTTP (500, 200, 204, etc.) junto con los datos JSON.
He intentado utilizar HttpServletResponse
:
response.sendError("error message", 500);
Pero esto hizo que el navegador piense que es un "verdadero" 500 por lo que la página web de salida fue una página de error HTTP 500 regular.
Quiero devolver un código de estado HTTP para que mi JavaScript del lado del cliente pueda manejar alguna lógica que dependa de él (para, por ejemplo, mostrar el código de error y el mensaje en una página HTML). ¿Es esto posible o los códigos de estado HTTP no deberían usarse para tal cosa?
He aquí un ejemplo:
@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();
}
Echa un vistazo a la clase Response.
Tenga en cuenta que siempre debe especificar un tipo de contenido, especialmente si usted está pasando varios tipos de contenido, pero si cada mensaje se representará como JSON, puede simplemente anotar el método con @Produces("application/json")
.
JAX-RS tiene soporte para códigos HTTP estándar/personalizados. Véase ResponseBuilder y ResponseStatus, por ejemplo:
Ten en cuenta que la información JSON es más sobre los datos asociados al recurso/aplicación. Los códigos HTTP son más sobre el estado de la operación CRUD que se solicita. (al menos así es como se supone que es en los sistemas REST)