Je développe un service RESTful simple pour les tournois et les horaires. Lorsqu'un tournoi est créé via une requête POST contenant un corps JSON, le tournoi est inséré dans un BiMap
, déclaré comme suit dans une implémentation DAO:
private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());
Lorsqu'un tournoi est créé, son identifiant de chaîne associé est renvoyé afin que l' utilisateur puisse avoir une référence future de ce tournoi. Il / elle peut obtenir des informations du nouveau tournoi en effectuant la demande suivante:
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
Mais que se passe-t-il si aucun tournoi avec un tel identifiant n'est trouvé? Jusqu'à présent, je retourne une réponse 204. Eh bien, Jersey le fait pour moi en revenant null
d'une de ses méthodes. C'est la méthode qui correspond à l'itinéraire ci-dessus:
@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;
}
Ma question est: est-il correct de renvoyer une 204: No Content
réponse, ou devrait-il plutôt être une 404
réponse, car la ressource n'a pas été trouvée?
Si je devais le changer en 404, question évidente: devrais-je changer la signature de la méthode non? Etant donné que maintenant un tournoi (de type Tournament
) peut ne pas être retourné, la méthode devrait être différente. Dois-je Response
plutôt utiliser le type comme type de retour?
la source
{content: ''}
), une réponse 204 serait inappropriée.2015-02-29
serait mieux, puisque c'est une date qui n'existe pas du tout?Vous devez renvoyer un 404. Vous pouvez le faire en lançant une NotFoundException ( https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).
Veuillez également consulter cette question SO si vous devez contrôler le type de contenu renvoyé /programming/23858488/how-i-return-http-404-json-xml-response-in-jax-rs- jersey-sur-tomcat
la source
Votre demande est
GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39
.Si
http://localhost:8080/eventscheduler/
n'existe pas en tant que point de terminaison, vous devez renvoyer un 404. Vous essayez d'accéder à une ressource (/eventscheduler/
) qui n'existe pas. Cela indiquerait à un client qu'un serveur existelocalhost:8080
, mais il n'y a rien au niveau dueventscheduler
point de terminaison.S'il
http://localhost:8080/eventscheduler/
existe en tant que point de terminaison mais que les ressources requises ne sont pas disponibles, une erreur 5xx est appropriée. Un bon exemple de cela serait si une base de données est hors ligne, où vous pouvez renvoyer un 503. Bien sûr, vous pouvez simplement renvoyer une erreur générique 500 au lieu d'une instance spécifique.S'il
http://localhost:8080/eventscheduler/
existe mais que la chose représentée parc15268ce-474a-49bd-a623-b0b865386f39
n'existe pas, je retournerais un 200 avec un corps indiquant les détails. Le point de terminaison existe, la demande effectuée était totalement valide et pouvait être traitée, mais il n'y avait aucune correspondance.Si la demande de votre client au point de terminaison n'était pas valide, vous examineriez les autres erreurs 4xx. Vous pouvez indiquer que le client n'est pas autorisé à accéder au point de terminaison ou aux éléments demandés avec un 401 ou 403 ou pouvez utiliser un 400 pour indiquer que la demande n'est pas valide. Avec n'importe lequel de ces éléments, des informations supplémentaires peuvent être fournies dans le corps de réponse.
la source
/user
et est utilisé comme/[email protected]
. En tant que consommateur d'API, je veux savoir si,/user
pour une raison quelconque, n'existe pas sur le serveur (peut-être qu'il a été ajouté dans la v2 de l'API et que le serveur est dans la v1 ou il a été renommé dans la v3) ou si l'utilisateur avec l'e-mail[email protected]
n'existe pas. Le premier est un 404, le second est un 200 avec un corps qui n'indique aucun utilisateur avec cette adresse e-mail.