Mise à jour : Cela fait presque 5 ans depuis que j'ai écrit la réponse ci-dessous ; aujourd'hui j'ai une perspective différente.
99 % du temps, lorsque les gens utilisent le terme REST, ils veulent vraiment dire HTTP ; ils se soucient peu des "ressources", des "représentations", des "transferts d'état", des "interfaces uniformes", de l'"hypertexte", ou de tout autre contraintes ou aspects du style architectural REST identifié par Fielding. Les abstractions fournies par divers cadres REST sont donc confuses et peu utiles.
Alors : vous voulez envoyer des requêtes HTTP en utilisant Java en 2015. Vous voulez une API claire, expressive, intuitive, idiomatique, simple. Que choisir ? Je n'utilise plus Java, mais depuis quelques années la bibliothèque cliente HTTP Java qui semblait la plus prometteuse et intéressante est OkHttp. Jetez un coup d'œil.
Vous pouvez certainement interagir avec des services web RESTful en utilisant URLConnection
ou HTTPClient pour coder les requêtes HTTP.
Cependant, il est généralement plus souhaitable d'utiliser une bibliothèque ou un cadre qui fournit une API plus simple et plus sémantique spécialement conçue à cette fin. Cela rend le code plus facile à écrire, à lire, à déboguer et réduit la duplication des efforts. Ces frameworks implémentent généralement des fonctionnalités fantastiques qui ne sont pas nécessairement présentes ou faciles à utiliser dans des bibliothèques de plus bas niveau, telles que la négociation de contenu, le caching et l'authentification.
Certaines des options les plus matures sont Jersey, RESTEasy et Restlet.
Je suis plus familier avec Restlet et Jersey, regardons comment nous pourrions faire une requête POST
avec les deux API.
Exemple de Jersey
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
Client client = ClientBuilder.newClient();
WebTarget resource = client.target("http://localhost:8080/someresource");
Builder request = resource.request();
request.accept(MediaType.APPLICATION_JSON);
Response response = request.get();
if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity());
}
Exemple de Restlet
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
ClientResource resource = new ClientResource("http://localhost:8080/someresource");
Response response = resource.post(form.getWebRepresentation());
if (response.getStatus().isSuccess()) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity().getText());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity().getText());
}
Évidemment, les requêtes GET sont encore plus simples, et vous pouvez également spécifier des éléments comme les balises d'entité et les en-têtes Accept
, mais espérons que ces exemples sont utiles, non triviaux mais pas trop complexes.
Comme vous pouvez le voir, Restlet et Jersey ont des API clients similaires. Je crois qu'ils ont été développés en même temps, et se sont donc influencés mutuellement.
Je trouve l'API Restlet un peu plus sémantique, donc un peu plus claire, mais cela peut varier d'une personne à l'autre.
Comme je l'ai dit, je suis plus familier avec Restlet, je l'ai utilisé dans de nombreuses applications depuis des années, et j'en suis très satisfait. C'est un framework très mature, robuste, simple, efficace, actif et bien soutenu. Je ne peux pas parler de Jersey ou RESTEasy, mais j'ai l'impression qu'ils sont également des choix solides.
0 votes
Cela dépend de la façon dont vous effectuez des appels de repos dans votre application. Utilisez-vous une implémentation JaxRS ? Une en particulier ? Faites-vous des requêtes manuellement ?
0 votes
@Colin Hebert, merci pour votre réponse. Mais je n'ai aucune idée de l'appel RESTful. Pourriez-vous me donner plus d'informations sur les différentes parties de l'appel RESTful.
0 votes
Vérifiez le client RESTful HTTP cliquez ici