web-dev-qa-db-fra.com

Appel RESTful dans Java

Je vais faire un appel RESTful en Java. Cependant, je ne sais pas comment faire l'appel. Dois-je utiliser l'URLConnection ou d'autres? Quelqu'un peut-il m'aider. Merci.

133
Questions

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

Si vous ne souhaitez pas utiliser de bibliothèques externes, vous pouvez utiliser Java.net.HttpURLConnection ou javax.net.ssl.HttpsURLConnection (pour SSL), mais cet appel 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 et analyser la chaîne en son objet représentatif (XML, JSON, etc.).

Alternativement, Apache HttpClient (la version 4 est la dernière). Il est plus stable et robuste que le URLConnection par défaut de Java et prend en charge la plupart (sinon la totalité) des protocoles HTTP (il peut également être défini en mode strict). Votre réponse sera toujours dans InputStream et vous pourrez l'utiliser comme indiqué ci-dessus.


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

83
Buhake Sindi

Mise à jour: Cela fait presque 5 ans que j'ai écrit la réponse ci-dessous; aujourd'hui j'ai une perspective différente.

99% du temps quand les gens utilisent le terme REST, ils veulent vraiment dire HTTP; ils se moquent bien des "ressources", des "représentations", des "transferts d'état", des "interfaces uniformes", "hypermédia" ou de toute autre contrainte ou aspect de l'architecture REST style identifié par Fielding . Les abstractions fournies par divers REST cadres sont donc déroutantes et inutiles.

Donc, vous souhaitez envoyer des requêtes HTTP à l'aide de Java en 2015. Vous souhaitez une API claire, expressive, intuitive, idiomatique, simple. Quoi utiliser? Je n'utilise plus Java, mais depuis quelques années, la bibliothèque client HTTP Java qui semble être la plus prometteuse et la plus intéressante est OkHttp . Vérifiez-le.


Vous pouvez certainement interagir avec les services Web RESTful en utilisant URLConnection ou HTTPClient pour coder les demandes HTTP.

Cependant, il est généralement plus souhaitable d'utiliser une bibliothèque ou un framework fournissant une API plus simple et plus sémantique spécialement conçue à cet effet. Cela facilite l'écriture, la lecture et le débogage du code, ainsi que la duplication des efforts. Ces frameworks implémentent généralement certaines fonctionnalités intéressantes qui ne sont pas nécessairement présentes ou faciles à utiliser dans les bibliothèques de niveau inférieur, telles que la négociation de contenu, la mise en cache et l'authentification.

Certaines des options les plus avancées sont Jersey , RESTEasy et Restlet .

Je connais le mieux Restlet et Jersey, voyons comment nous pourrions faire une demande 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 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());
}

Bien entendu, les requêtes GET sont encore plus simples et vous pouvez également spécifier des éléments tels que les balises d'entité et les en-têtes Accept, mais nous espérons que ces exemples sont utilement non triviaux, mais pas trop complexes.

Comme vous pouvez le constater, Restlet et Jersey ont des API clientes similaires. Je crois qu'ils ont été développés à peu près au même moment et se sont donc mutuellement influencés.

Je trouve que l'API Restlet est un peu plus sémantique, et donc un peu plus claire, mais YMMV.

Comme je l'ai dit, je connais le mieux Restlet, je l'utilise dans de nombreuses applications depuis des années et j'en suis très heureux. C'est un framework très mature, robuste, simple, efficace, actif et bien supporté. Je ne peux parler ni de Jersey ni de RESTEasy, mais j’ai l’impression que ce sont deux choix solides.

144
Avi Flax

C’est très compliqué en Java, c’est pourquoi je suggère d’utiliser l’abstraction de RestTemplate :

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

Référence:

27
Sean Patrick Floyd

Si vous devez simplement appeler un service REST à partir de Java, vous utilisez quelque chose le long de cette ligne.

/*
 * Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html
 * and 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;

        //make connection
        URLConnection urlc = url.openConnection();

        //use post mode
        urlc.setDoOutput(true);
        urlc.setAllowUserInteraction(false);

        //send query
        PrintStream ps = new PrintStream(urlc.getOutputStream());
        ps.print(query);
        ps.close();

        //get result
        BufferedReader br = new BufferedReader(new InputStreamReader(urlc
            .getInputStream()));
        String l = null;
        while ((l=br.readLine())!=null) {
            System.out.println(l);
        }
        br.close();
    }
}
23
jitter

Il existe plusieurs API RESTful autour. Je recommanderais Jersey;

https://jersey.Java.net/

La documentation de l'API client est ici;

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

Mettre à jour
L'emplacement des OAuth documents 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

10
Qwerky

Je souhaite partager mon expérience personnelle en appelant un REST WS avec appel JSON ultérieur:

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.io.PrintStream;
import Java.net.URL;
import Java.net.URLConnection;

public class HWS {

    public static void main(String[] args) throws IOException {
        URL url = new URL("INSERT YOUR SERVER REQUEST");
        //Insert your JSON query request
        String query = "{'PARAM1': 'VALUE','PARAM2': 'VALUE','PARAM3': 'VALUE','PARAM4': 'VALUE'}";
        //It change the apostrophe char to double colon char, to form a correct JSON string
        query=query.replace("'", "\"");

        try{
            //make connection
            URLConnection urlc = url.openConnection();
            //It Content Type is so importan to support JSON call
            urlc.setRequestProperty("Content-Type", "application/xml");
            Msj("Conectando: " + url.toString());
            //use post mode
            urlc.setDoOutput(true);
            urlc.setAllowUserInteraction(false);

            //send query
            PrintStream ps = new PrintStream(urlc.getOutputStream());
            ps.print(query);
            Msj("Consulta: " + query);
            ps.close();

            //get result
            BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
            String l = null;
            while ((l=br.readLine())!=null) {
                Msj(l);
            }
            br.close();
        } catch (Exception e){
            Msj("Error ocurrido");
            Msj(e.toString());
        }
    }

    private static void Msj(String texto){
        System.out.println(texto);
    }
}
7
Lisandro

Vous pouvez vérifier le CXF . Vous pouvez visiter l'article JAX-RS ici

L'appel est aussi simple que cela (citation):

BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class);
// (1) remote GET call to http://bookstore.com/bookstore
Books books = store.getAllBooks();
// (2) no remote call
BookResource subresource = store.getBookSubresource(1);
// {3} remote GET call to http://bookstore.com/bookstore/1
Book b = subresource.getDescription();
5
Joopiter

La solution la plus simple utilisera la bibliothèque cliente Apache http. reportez-vous à l'exemple de code suivant .. ce code utilise une sécurité de base pour l'authentification.

Ajouter la dépendance suivante.

<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
Credentials credentials = new UsernamePasswordCredentials("username", "password");
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request);
    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    String line = "";
    while ((line = rd.readLine()) != null) {    
    textView = textView + line;
    }
    System.out.println(textView);
4
Hemin

En effet, c'est "très compliqué en Java":

De: https://jersey.Java.net/documentation/latest/client.html

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://foo").path("bar");
Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();
4
JRun