Dans JAX RS, les différences entre le retour de la Réponse et de Haricots ou de la Collection de Fèves (DTO)
Je travaille sur la construction d'une api REST. Ma question est, lors de l'utilisation de Jersey, quelles sont les différences entre mes services de construction et de retourner un objet de Réponse ou en retournant le haricot ou de la collection. Je suis le seul souci de réussite des appels, je suis de jeter des exceptions appropriées pour les erreurs et les situations exceptionnelles.
Ici est un exemple:
@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
List<FooBean> results = bar.search(foo);
return Response.ok(results).build();
}
vs
@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
List<FooBean> results = bar.search(foo);
return results;
}
J'ai vu tant d'exemples, et je préfère le deuxième scénario, juste pour rendre les choses plus faciles à reconnaître la méthode de service. J'ai examiné les réponses de ces deux méthodes, et ils semblent être identiques.
Pensées?
- Ils être identiques, compte tenu que vous n'avez pas de retour de certains
Exception
classe comme vous l'avez dit. LeResponse
offrir la possibilité de renvoyer n'importe quel type d'objet, et aussi de mettre unHttpStatus
. Dans ce cas, il en résultera200 OK
. Mais tu ne peux pas passer à un autre statut que vous le souhaitez à l'aide deResponse
. C'est mon avis, bien sûr, mais j'aime leResponse
façon. - Voulez-vous dire que vous POUVEZ passer à un autre statut de la réponse à l'aide de l'objet de la Réponse? Si je retourne une Liste<FooBean>, le statut de la réponse est aussi 200 OK.
- Oui, vous pouvez changer si vous le souhaitez. Par défaut
Response.ok().entity(entity).build();
sera de retour200 OK
si l'entité n'est pas nul, sinon, sera de retour204 NO CONTENT
. Vous pouvez forcer à retourner un200 OK
état avecResponse.ok().entity(entity).status(Status.OK).build();
même de l'entité null; - Je vois. Ainsi, en plus de préférence, quelle est la différence entre le retour du bean vs revenir avec la Réponse builder?
- Non, si vous intercepter les exceptions avant ou intercepter après votre classe de ressource, il n'y a pas de diference...
Vous devez vous connecter pour publier un commentaire.
Les différences sont expliquées dans le JAX-RS spécifications:
"Normales", les haricots sont mappés sur à peu près de la même façon que
Response
est, à l'exception d'unResponse
vous permet de définir des métadonnées supplémentaires (en-têtes de réponse, le statut de spécialiste, spécialisé type de contenu, etc). Dans la mesure où l'un pour l'utiliser, c'est entièrement à vous de décider deResponse
vous donne plus de flexibilité, mais réguliers, les haricots sont plus "auto-documentation'.Il n'y a pas de diference si vous souhaitez renvoyer toujours la réponse
200 - OK
, attraper et manipuler toutes les exceptions qui peuvent se produire avant ou après votre retour de méthode le résultat, avec les interceptions ouWebApplicationException
. Donc, ces deux méthodes entraînera les mêmes réponses.La seule diference est à des scénarios spécifiques, comme le retour des objets nuls, ou la création d'objet, comme dans cet exemple:
Dans ce cas, le retour sera
201 - CREATED
(Avec l'URI pour accéder à l'objet créé)Donc, la méthode suivante:
... sera de retour une réponse
200 - OK
Si vous n'avez pas de soins sur laquelle le statut de la réponse de votre client recevra, vous pouvez utiliser l'une des déclarations sans problème.
Source: Jersey.
Mon personnel de vue, si la réponse contient DTO (Bean/Collection de fèves), puis repos de service doit toujours retourner DTO, mais pas de Réponse de l'objet.
La motivation: tôt ou tard, il vous sera demandé de faire un usage du service rest plus facile pour les clients, en fournissant client rest api. Habituellement, vous devez extraire interfaces rest pour elle, et de les mettre en œuvre avec votre des services rest. Ces interfaces rest sont utilisés par les clients de votre client rest.
Client et du point de vue, il y a une énorme différence entre le traitement DTO et de la plaine de Réponse. En cas de Réponse est utilisé, le client est obligé:
Qui signifie maniabilité est très similaire à retourner des codes d'erreur dans les méthodes, ce qui est considéré comme une très mauvaise pratique. Afin de gérer les erreurs dans un seul lieu, les exceptions sont utilisées (je ne parle pas de FP façons de gérer les erreurs, ce qui est le meilleur).
Donc, ce qui peut vous faire:
Donc, si penser à l'avance, vous devez retourner DTO.
Un cas d'utilisation, lors de la plaine de Réponse doivent être retournés - lorsque vous exportez des fichiers, par exemple. Il semble JAX RS ne permettent pas de revenir objet InputStream. Pas sûr, il doit être vérifié.
Les autres cas d'utilisation, a été signalé par @Perception, mais il est plus une exception qu'une règle:
Note: c'est une question d'ordre général pour JAX RS, ne dépend pas de l'exacte mise en œuvre, comme Resteasy ou Jersey