256 votes

Comment créer un client REST pour Java ?

Avec la JSR 311 et ses implémentations, nous disposons d'une norme puissante pour l'exposition d'objets Java via REST. Cependant, du côté client, il semble manquer quelque chose de comparable à Apache Axis pour SOAP - quelque chose qui cache le service web et marshalise les données de manière transparente en objets Java.

Comment créer des clients Java RESTful ? En utilisant HTTPConnection et en analysant manuellement le résultat ? Ou des clients spécialisés pour, par exemple, Jersey ou Apache CXR ?

0 votes

Je viens de trouver Clin d'œil apache dans l'incubateur Apache. Il pourrait s'agir d'un projet intéressant pour la création de serveurs et de clients REST.

2 votes

0 votes

Voir [Repos]( code.google.com/p/resting ). Il promet d'invoquer les services REST et de créer une liste d'objets à partir de la réponse XML/JSON/YAML en une seule étape.

224voto

Adam Gent Points 15055

Il s'agit d'une ancienne question (2008) et il y a donc beaucoup plus d'options aujourd'hui qu'à l'époque :

MISES À JOUR (projets toujours actifs en 2020) :

  • Composants Apache HTTP (4.2) Adaptateur Fluent - Remplacement de base du JDK, utilisé par plusieurs autres candidats de cette liste. Meilleur que l'ancien Commons HTTP Client 3 et plus facile à utiliser pour construire votre propre client REST. Vous devrez utiliser quelque chose comme Jackson pour l'analyse JSON et vous pouvez utiliser Composants HTTP URIBuilder pour construire des URI de ressources similaire au client Jersey/JAX-RS Rest. Les composants HTTP supportent également NIO mais je doute que vous obteniez de meilleures performances que BIO étant donné la nature courte des requêtes de REST. Apache HttpComponents 5 prend en charge HTTP/2.
  • OkHttp - Remplacement de base du JDK, similaire aux composants http, utilisés par plusieurs autres candidats de cette liste. Prend en charge les protocoles HTTP les plus récents (SPDY et HTTP2). Fonctionne sur Android. Malheureusement, il n'offre pas de véritable option asynchrone basée sur une boucle de réacteur (voir Ning et les composants HTTP ci-dessus). Cependant, si vous utilisez le nouveau protocole HTTP2, cela est moins problématique (en supposant que le nombre de connexions soit un problème).
  • Ning Async-http-client - assure la prise en charge de l'interface homme-machine. Précédemment connu sous le nom de Client asynchrone par Sonatype .
  • Feindre pour les clients http de niveau inférieur (okhttp, apache httpcomponents). Création automatique de clients basés sur des interfaces similaires à certaines extensions Jersey et CXF. Forte intégration de Spring.
  • Rénovation - pour les clients http de niveau inférieur (okhttp). Il crée automatiquement des clients basés sur des interfaces similaires à certaines extensions Jersey et CXF.
  • Volley wrapper pour le client http du jdk, par google
  • google-http wrapper pour le client http de jdk, ou apache httpcomponents, par google
  • Unirest wrapper pour le client http de jdk, par kong
  • Resteasy JakartaEE wrapper pour le client http de jdk, par jboss, faisant partie du framework jboss
  • jcabi-http enveloppe pour les composants http apache, fait partie de la collection jcabi
  • restlet enveloppe pour les composants http apache, fait partie du framework restlet
  • repos assuré avec des assertions pour faciliter les tests

Une mise en garde sur le choix des clients HTTP/REST. Assurez-vous de vérifier ce que votre framework utilise comme client HTTP, comment il gère le threading, et idéalement utilisez le même client s'il en propose un. C'est-à-dire que si vous utilisez quelque chose comme Vert.x ou Play, vous pouvez essayer d'utiliser son client de backing pour participer à n'importe quel bus ou boucle de réacteur que le framework fournit... sinon préparez-vous à d'éventuels problèmes de threading.

1 votes

Malheureusement, le client Jersey ne prend pas en charge la méthode PATCH s'il est utilisé avec le JDK < 8.

1 votes

Ainsi que le client Jersey a de sérieuses fuites de mémoire java.net/jira/browse/JERSEY-2830

3 votes

Unirest est très facile à utiliser, mais sa conception statique le rend inutilisable dans les environnements partagés et les serveurs.

73voto

James Strachan Points 6144

Comme je l'ai mentionné dans ce fil J'ai tendance à utiliser Jersey qui implémente JAX-RS et s'accompagne d'un client REST sympathique. L'avantage est que si vous implémentez vos ressources RESTful en utilisant JAX-RS, le client Jersey peut réutiliser les fournisseurs d'entités tels que JAXB/XML/JSON/Atom et ainsi de suite - vous pouvez donc réutiliser les mêmes objets du côté serveur que ceux que vous utilisez dans le test unitaire du côté client.

Par exemple Voici un cas de test unitaire de la Projet Apache Camel qui recherche des charges utiles XML à partir d'une ressource RESTful (en utilisant l'objet JAXB Endpoints). La méthode resource(uri) est définie dans le document cette classe de base qui utilise simplement l'API du client Jersey.

par exemple

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

BTW J'espère que la future version de JAX-RS ajoutera une API côté client similaire à celle de Jersey.

0 votes

Existe-t-il une méthode permettant de mentionner la liste des serveurs du service REST dans ClientResource, au cas où le serveur est indisponible, essayez le serveur suivant ?

1 votes

Juste une mise à jour, mais pour répondre au commentaire "BTW" de James, la nouvelle version de JAX-RS 2.0 aura une API côté client : infoq.com/présentations/Java-REST

65voto

Blaise Doughan Points 75613

Vous pouvez utiliser les API standard de Java SE :

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

Vous pouvez également utiliser les API client REST fournies par les implémentations JAX-RS telles que Jersey. Ces API sont plus faciles à utiliser, mais nécessitent des pots supplémentaires dans votre chemin de classe.

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

Pour plus d'informations, voir :

22 votes

13 lignes pour un simple appel de repos, en 2018 Il semble que ce soit beaucoup trop...

3 votes

Une fois que vous avez ajouté la gestion des erreurs et les options, il n'y a pas de différence significative. Si l'approche SE semble longue, vous pouvez toujours l'envelopper dans une classe... :> Après deux jours de débogage de conflits de bibliothèques JAX-RS, je suis vraiment d'accord avec 5 lignes de code supplémentaires pour éviter tout le cauchemar SPI.

3 votes

@ClintEastwood cet article a été écrit en 2010

14voto

Johan Points 1120

Si vous souhaitez uniquement invoquer un service REST et analyser la réponse, vous pouvez essayer la méthode suivante Soyez rassurés

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");

9voto

Jerome Louvel Points 289

Vous pouvez également vérifier Restlet qui possède des capacités complètes côté client, plus orientées REST que les bibliothèques de niveau inférieur telles que HttpURLConnection ou Apache HTTP Client (que nous pouvons exploiter en tant que connecteurs).

Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées, Jérôme Louvel

2 votes

En date du 2019-10-24, le lien fourni renvoie : "Restlet Platform has reached end of life" (La plateforme Restlet a atteint sa fin de vie).

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