Estoy desarrollando un servicio RESTful simple para torneos y horarios. Cuando se crea un torneo a través de una solicitud POST que contiene un cuerpo JSON, el torneo se inserta en un BiMap
, declarado de la siguiente manera en una implementación DAO:
private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());
Cuando se crea un torneo, se devuelve su ID de cadena asociada para que el usuario pueda tener una referencia futura de ese torneo. Él / ella puede obtener información del nuevo torneo realizando la siguiente solicitud:
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
¿Pero qué pasa si no se encuentra un torneo con tal identificación? Hasta ahora, estoy devolviendo una respuesta 204. Bueno, Jersey lo está haciendo por mí cuando regresa null
de uno de sus métodos. Este es el método que corresponde a la ruta anterior:
@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
Optional<Tournament> optTournament = tournamentDao.getTournament(id);
if (optTournament.isPresent())
return optTournament.get();
return null;
}
Mi pregunta es: ¿está bien devolver una 204: No Content
respuesta, o debería ser una 404
respuesta, ya que no se encontró el recurso?
Si debo cambiarlo a 404, pregunta obvia: ¿Debería cambiar la firma del método correcto? Como ahora un torneo (de tipo Tournament
) podría no ser devuelto, el método debería verse diferente. ¿Debo usar el Response
tipo como el tipo de retorno en su lugar?
fuente
{content: ''}
), una respuesta 204 sería inapropiada.2015-02-29
sería mejor, ya que es una fecha que no existe en absoluto.Debe devolver un 404. Puede hacerlo lanzando una NotFoundException ( https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).
Además, consulte esta pregunta SO si necesita controlar el tipo de contenido devuelto /programming/23858488/how-i-return-http-404-json-xml-response-in-jax-rs- jersey-on-tomcat
fuente
Su solicitud es
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
.Si
http://localhost:8080/eventscheduler/
no existe como punto final, debe devolver un 404. Está intentando acceder a un recurso (/eventscheduler/
) que no existe. Esto indicaría a un cliente que existe un servidorlocalhost:8080
, pero no hay nada en eleventscheduler
punto final.Si
http://localhost:8080/eventscheduler/
existe como un punto final pero los recursos requeridos no están disponibles, es apropiado un error 5xx. Un buen ejemplo de esto sería si una base de datos está fuera de línea, donde podría devolver un 503. Por supuesto, es posible que solo desee devolver un error genérico 500 en lugar de una instancia específica.Si
http://localhost:8080/eventscheduler/
existe pero la cosa representada porc15268ce-474a-49bd-a623-b0b865386f39
no existe, devolvería un 200 con un cuerpo que indica los detalles. El punto final existe, la solicitud realizada era totalmente válida y podía procesarse, pero no había coincidencia.Si la solicitud de su cliente al punto final no era válida, debería ver los otros errores 4xx. Puede indicar que el cliente no está autorizado para acceder al punto final o los elementos solicitados con un 401 o 403 o puede usar un 400 para indicar que la solicitud no es válida. Con cualquiera de estos, se puede proporcionar información adicional en el cuerpo de respuesta.
fuente
/user
y se usa como/[email protected]
. Como consumidor de API, quiero saber si/user
por alguna razón no existe en el servidor (tal vez se agregó en la v2 de la API y el servidor está en la v1 o se cambió el nombre en la v3) o si el usuario con el correo electrónico[email protected]
no existe El primero es un 404, el segundo es un 200 con un cuerpo que indica que ningún usuario tiene esa dirección de correo electrónico.