Il faut commencer par créer un [[:ide:eclipse:projet#creation_d_un_dynamic_web_project|projet Web Dynamic]] avec le support de [[:ide:eclipse:projet#activer_le_support_de_jax-rs_rest|JAX-RS (REST Web Service)]]. Ensuite, il faut créer le serveur en créant une classe normale. Pour Jersey, il est indispensable que le serveur soit dans un ''package'' non vide. Dans l'exemple ci-dessous, il faut aussi pour Tomcat et le projet la librairie [[https://github.com/stleary/JSON-java|java-json.jar]] (à mettre dans le dossier ''WebContent/lib'') qui facilitera la réponse au client. Attention, j'ai eu personnellement beaucoup de mal à faire fonctionner REST sur Eclipse. On pense que tout est bien configuré et ça ne marche pas pendant des heures. Puis d'un coup, on a l'impression que le projet tombe en marche miraculeusement… O_o J'ai réussi plusieurs fois à faire fonctionner REST sans que ''JAX-RS'' soit activé dans ''Project Facets'' mais jamais avec. Donc prudence. Pareil, avec ''@Path'' mais avec ''@ApplicationPath'' ça ne marche pas (oui, j'ai bien fait hérité de la classe ''Application''). package com.llgc; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; /* import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; */ import org.json.JSONException; import org.json.JSONObject; @Path("/euro") public class Serveur { // Ici, le path est cumulatif avec le "/euro". // On fait donc bien référence au chemin "/euro/{f}" avec {f} : un nombre // flottant @Path("{f}") // Méthode GET @GET // Mime Type en sortie @Produces(MediaType.APPLICATION_XML) // Mime Type en entrée @Consumes(MediaType.APPLICATION_XML) // On dit que le f est extrait du path et que c'est un double. public String traitementXml(@PathParam("f") Double f) { return "" + f / 6.65 + "" + f + ""; } @Path("{f}") @GET @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public String traitementJson(@PathParam("f") Double f) throws JSONException { JSONObject jsonObject = new JSONObject(); jsonObject.put("Francs", f); jsonObject.put("Euros", f / 6.65); return jsonObject.toString(); } @Path("{f}") @GET @Produces(MediaType.TEXT_HTML) @Consumes(MediaType.TEXT_HTML) public String traitementPlainHtml(@PathParam("f") Double f) throws JSONException { JSONObject jsonObject = new JSONObject(); jsonObject.put("FrancsHMTLHTMLHTML", f); jsonObject.put("Euris", f / 6.65); return jsonObject.toString(); } @GET @Path("/down") @Produces("image/png") // Le client veut télécharger public Response download() { File file = new File("image.png"); ResponseBuilder response = Response.ok((Object) file); response.header("Content-Disposition", "attachment; filename=test.png"); return response.build(); } @Path("/upload") @POST @Consumes(MediaType.MULTIPART_FORM_DATA) // Le client veut uploader public Response upload(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) { String uploadedFileLocation = "./" + "Jersey_" + fileDetail.getFileName(); saveToFile(uploadedInputStream, uploadedFileLocation); String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation; return Response.status(200).entity(output).build(); } private void saveToFile(InputStream uploadedInputStream, String uploadedFileLocation) { try { OutputStream out = null; int read = 0; byte[] bytes = new byte[1024]; out = new FileOutputStream(new File(uploadedFileLocation)); while ((read = uploadedInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } Utilisation d'un Bean pour architecturer ces données public class MyBeanParam {   @PathParam("p")   private String pathParam;     @MatrixParam("m")   @Encoded   @DefaultValue("default")   private String matrixParam;     @HeaderParam("header")   private String headerParam;     private String queryParam;     public MyBeanParam(@QueryParam("q") String queryParam) {     this.queryParam = queryParam;   }     public String getPathParam() {     return pathParam;   } } @POST public void post(@BeanParam MyBeanParam beanParam, String entity) {     final String pathParam = beanParam.getPathParam(); // contains injected path parameter "p"     ... } [[https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/jaxrs-resources.html|JAX-RS Application, Resources and Sub-Resources]] {{ :lang:java:rest:chapter_3._jax-rs_application_resources_and_sub-resources_2020-04-27_11_48_03_am_.html |Archive du 02/03/2020 le 27/04/2020}} REST index.html index.htm index.jsp default.html default.htm default.jsp JAX-RS Tools Generated - Do not modify JAX-RS Servlet org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages com.llgc 1 JAX-RS Servlet /convert/* ====Exemple de client==== import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; public class ClientJersey { public static void delete() { String url = "http://localhost:8080/client/del/0"; URI uri = URI.create(url); final Client client = ClientBuilder.newClient(); WebTarget webTarget = client.target(uri); Response response = webTarget.request().delete(); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } System.out.println("Output delete from Server .... \n" + response.getStatus()); } public static void main(String[] args) { try { delete(); String url = "http://localhost:8080/helloworld/xml"; URI uri = URI.create(url); final Client client = ClientBuilder.newClient(); WebTarget webTarget = client.target(uri); Response response = webTarget.request(MediaType.APPLICATION_XML).get(); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String output = response.readEntity(String.class); System.out.println("Output XML from Server .... \n"); System.out.println(output); } catch (Exception e) { e.printStackTrace(); } } } =====Erreurs===== ====javax.servlet.ServletException: Aucune classe servlet n'a été spécifiée pour la servlet JAX-RS Servlet==== Il faut spécifier dans ''web.xml'' la classe Serveur : org.glassfish.jersey.servlet.ServletContainer