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.
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
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.
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());
}
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.
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:
RestTemplate
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();
}
}
Il existe plusieurs API RESTful autour. Je recommanderais Jersey;
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
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);
}
}
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();
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);
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();