176 votes

Appel RESTful en Java

Je vais faire un appel RESTful en Java. Cependant, je ne sais pas comment faire l'appel. Dois-je utiliser le URLConnection ou d'autres?

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

172voto

Avi Flax Points 14898

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.

2 votes

Mais c'est quand même un excellent article. Et je suis d'accord avec "99% du temps, lorsque les gens utilisent le terme REST, ils veulent vraiment dire HTTP; ... Les abstractions fournies par divers cadres REST sont donc confuses et peu utiles."

2 votes

Dans votre exemple Jersey, où/comment l'objet Form est-il utilisé ? Il est créé, mais il ne semble pas ajouter quoi que ce soit à l'exemple.

0 votes

@plungebob cela peut être fait sur l'objet "request" de type Builder. Dans les lignes ci-dessus, le point final donné est appelé via un GET (request.get()). Un POST/PUT serait appelé par la méthode appropriée de l'objet Builder. Par exemple, Response response = request.put(Entity.entity(payload, MediaType.APPLICATION_JSON));, où 'payload' pourrait être une chaîne JSON aplatie.

102voto

Buhake Sindi Points 38654

Si vous appelez un service RESTful auprès d'un fournisseur de services (par exemple Facebook, Twitter), vous pouvez le faire avec n'importe quelle saveur de votre choix :

Si vous ne voulez pas utiliser de bibliothèques externes, vous pouvez utiliser java.net.HttpURLConnection ou javax.net.ssl.HttpsURLConnection (pour SSL), mais cela est encapsulé dans un modèle de type Factory dans java.net.URLConnection. Pour recevoir le résultat, vous devrez connection.getInputStream() qui vous renvoie un InputStream. Vous devrez ensuite convertir votre flux d'entrée en chaîne de caractères et analyser la chaîne en objet correspondant (par exemple XML, JSON, etc).

Alternativement, Apache HttpClient (la version 4 est la dernière). Il est plus stable et robuste que URLConnection par défaut de Java et prend en charge la plupart (si ce n'est pas tous) les protocoles HTTP (ainsi qu'il peut être configuré en mode Strict). Votre réponse sera toujours dans un InputStream et vous pouvez l'utiliser comme mentionné ci-dessus.


Documentation sur HttpClient : http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

7 votes

Ne réinventez pas la roue, utilisez l'une des implémentations RESTful existantes.

17 votes

Il ne s'agit pas de réinventer la roue, je dis juste que vous pouvez utiliser le flavour que vous voulez. Certains préfèrent l'URLConnection par défaut, d'autres préfèrent HttpClient. De toute façon, c'est là pour que vous puissiez l'utiliser.

0 votes

@L'élite Gentleman, merci pour votre réponse. Après avoir vérifié la bibliothèque, je souhaite utiliser l'Apache HttpClient, seriez-vous en mesure de me donner plus de références à ce sujet ?

32voto

Sean Patrick Floyd Points 109428

C'est très compliqué en java, c'est pourquoi je suggérerais d'utiliser l'abstraction de RestTemplate de Spring:

String result = 
restTemplate.getForObject(
    "http://example.com/hotels/{hotel}/bookings/{booking}",
    String.class,"42", "21"
);

Références:

0 votes

Selon ceci - stackoverflow.com/questions/42365266/… - RestTemplate sera obsolète dans une future version, utilisez l'alternative plus moderne WebClient

1 votes

@kaushalpranav ma réponse était vraie à l'époque, mais les choses changent. Je vous suggère d'ajouter votre propre réponse avec WebClient

0 votes

Vrai. J'ai récemment utilisé RestTemplate dans mes projets et je ne connaissais pas WebClient, donc je voulais simplement orienter les personnes venant ici vers la nouvelle alternative.

29voto

jitter Points 35805

Si vous avez simplement besoin d'effectuer un appel simple à un service REST depuis Java, vous utilisez quelque chose comme ceci

/*
 * Volé depuis http://xml.nig.ac.jp/tutorial/rest/index.html
 * et http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/
*/
import java.io.*;
import java.net.*;

public class Rest {

    public static void main(String[] args) throws IOException {
        URL url = new URL(INSERT_HERE_YOUR_URL);
        String query = INSERT_HERE_YOUR_URL_PARAMETERS;

        // établir la connexion
        URLConnection urlc = url.openConnection();

        // utiliser le mode POST
        urlc.setDoOutput(true);
        urlc.setAllowUserInteraction(false);

        // envoyer la requête
        PrintStream ps = new PrintStream(urlc.getOutputStream());
        ps.print(query);
        ps.close();

        // obtenir le résultat
        BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
        String l = null;
        while ((l=br.readLine())!=null) {
            System.out.println(l);
        }
        br.close();
    }
}

1 votes

Il existe de très bonnes API REST disponibles, je recommanderais d'en utiliser une plutôt que de réinventer la roue.

1 votes

Comme je l'ai dit : compliqué comme l'enfer. (non, je n'ai pas voté contre cela, c'est une solution parfaitement valable)

4 votes

@Qwerky Les bibliothèques API côté client sont généralement une violation des contraintes de REST. Elles introduisent beaucoup trop de couplage. Utiliser une bonne bibliothèque HTTP est une bien meilleure option à long terme.

10voto

Qwerky Points 10847

Il existe plusieurs APIs RESTful. Je recommanderais Jersey;

https://jersey.java.net/

La documentation de l'API client se trouve ici;

https://jersey.java.net/documentation/latest/index.html

Mise à jour
L'emplacement pour les documents OAuth dans le commentaire ci-dessous est un lien mort et a été déplacé vers https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334

7 votes

Le OP ne crée pas une application RESTful, il effectue des appels RESTful, c'est-à-dire comme appeler une ressource de méthode API Twitter.

0 votes

@Qwerky - Je pense que ce serait utile d'inclure pourquoi vous recommandez Jersey dans votre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X