IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

REST Discussion :

Implémenter un service web RESTful en Java


Sujet :

REST

  1. #1
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut Implémenter un service web RESTful en Java
    Bonjour à tous,

    Toujours dans ma découverte des services web en tous genres, je m'interroge cette fois-ci sur l'implémentation d'un service web RESTful.

    J'ai donc tout d'abord suivi ce tutorial permettant de créer un service web RESTful depuis une Entity Class avec NetBeans et de le déployer sous GlassFish (ou Tomcat moyennant quelques manipulations supplémentaires).
    J'ai également pu me reporter sur ces exercices détaillés sur le même sujet pour avancer.
    Tout fonctionne bien (tant sous GlassFish que sous Tomcat), mais je n'ai pas vraiment saisi comment créer un service web simple selon l'architecture REST.
    Malheureusement, je ne trouve pas d'autres tutoriaux initiant simplement à l'implémentation de services web RESTful avec NetBeans (a priori RESTful sans s à la fin, non ?), mais toujours ce même tutorial qui revient sous forme textuelle ou encore en vidéo...

    J'ai donc essayé de coder quelquechose de simple moi-même pour avoir par exemple une opération prenant une chaîne de caractères name et retournant "Hello name !" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import javax.ws.rs.core.Context;
    import javax.ws.rs.core.UriInfo;
    import javax.ws.rs.ProduceMime;
    import javax.ws.rs.ConsumeMime;
    import javax.ws.rs.PUT;
    import javax.ws.rs.Path;
    import javax.ws.rs.GET;
    
    @Path("generic")
    public class GenericResource {
        @Context
        private UriInfo context;
    
        /** Creates a new instance of GenericResource */
        public GenericResource() {
        }
    
        /**
         * Retrieves representation of an instance of texthtml.GenericResource
         * @return an instance of java.lang.String
         */
        @GET
        @ProduceMime("text/html")
        public String getHtml() {
            return "Hello World !";
        }
    
        /**
         * PUT method for updating or creating an instance of GenericResource
         * @param content representation for the resource
         * @return an HTTP response with content of the updated or created resource.
         */
        @PUT
        @ConsumeMime("text/html")
        public String putHtml(String name) {
            return "Hello " + name + " !";
        }
    }
    J'arrive à obtenir le message désiré en testant la méthode putHtml, mais je suis assez perdu dans la signification des annotations utilisées et je ne saisis pas pourquoi j'obtiens une erreur 404 (ressource non disponible) lorsque j'essaie de réécrire la méthode getHtml avec un paramètre name...
    Sinon, quelqu'un aurait-il un lien vers un autre tutorial pour l'implémentation de services web RESTful ?

    Je n'ai pas encore cherché à coder de client pour un service web RESTful, je risque sans doute d'avoir de nouvelles questions...
    J'ai également vu qu'Axis2 offrait le support de services web RESTful, donc je vais sûrement bientôt regarder de ce côté-là...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Je te conseille de chercher du côté du framework Restlet.

  3. #3
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Bonjour,

    Je me suis tout de même intéressé au support de REST par Axis2. J'ai notamment trouvé ce tutorial proposé par Apache et celui-ci qui propose une consommation du service web RESTful Yahoo Search.

    Le tutorial proposé par Apache décrit l'implémentation d'un client RESTful consommant un service web SOAP.

    Voici le code source de ce client RESTful :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package clients;
    
    import javax.xml.stream.FactoryConfigurationError;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamWriter;
    
    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axiom.om.OMNamespace;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.Constants;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;
    
    public class RESTClient {
    	private static String toEpr = "http://localhost:8080/axis2/services/MyService";
    
    	private static OMElement getPayload(String symbol) {
    		OMFactory fac = OMAbstractFactory.getOMFactory();
    		OMNamespace omNs = fac.createOMNamespace("http://ws.apache.org/axis2", "tns");
    		OMElement method = fac.createOMElement("echo", omNs);
    		OMElement value = fac.createOMElement("Text", omNs);
    
    		value.addChild(fac.createOMText(value, symbol));
    		method.addChild(value);
    
    		return method;
    	}
    
    	public static void main(String[] args) {
    		try {
    			OMElement payload = getPayload("Hello Christophe !");
    			Options options = new Options();
    
    			options.setTo(new EndpointReference(toEpr));
    			options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
    
    			ServiceClient sender = new ServiceClient();
    
    			sender.setOptions(options);
    
    			OMElement result = sender.sendReceive(payload);
    			XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
    
    			result.serialize(writer);
    			writer.flush();
    		} catch(AxisFault e) {
    			e.printStackTrace();
    		} catch(XMLStreamException e) {
    			e.printStackTrace();
    		} catch(FactoryConfigurationError e) {
    			e.printStackTrace();
    		}
    	}
    }
    En comparaison, voici le code d'un client SOAP que j'ai également trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package clients;
    
    import javax.xml.stream.FactoryConfigurationError;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamWriter;
    
    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axiom.om.OMNamespace;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.Constants;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;
    
    public class SOAPDynamicClient {
    	private static String toEpr = "http://localhost:8080/axis2/services/MyService";
    
    	private static OMElement getPayload(String symbol) {
    		OMFactory fac = OMAbstractFactory.getOMFactory();
    		OMNamespace omNs = fac.createOMNamespace("http://ws.apache.org/axis2", "tns");
    		OMElement method = fac.createOMElement("echo", omNs);
    		OMElement value = fac.createOMElement("Text", omNs);
    
    		value.addChild(fac.createOMText(value, symbol));
    		method.addChild(value);
    
    		return method;
    	}
    
    	public static void main(String[] args) {
    		try {
    			OMElement payload = getPayload("Hello Christophe !");
    			Options options = new Options();
    
    			options.setTo(new EndpointReference(toEpr));
    			options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
    
    			ServiceClient sender = new ServiceClient();
    
    			sender.setOptions(options);
    
    			OMElement result = sender.sendReceive(payload);
    			XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
    
    			result.serialize(writer);
    			writer.flush();
    		} catch(AxisFault e) {
    			e.printStackTrace();
    		} catch(XMLStreamException e) {
    			e.printStackTrace();
    		} catch(FactoryConfigurationError e) {
    			e.printStackTrace();
    		}
    	}
    }
    Comme vous pourrez le remarquer, une seule ligne diffère entre les deux codes et si l'on commente cette ligne, le résultat obtenu est toujours identique, à savoir (pour information) :
    <ns:echoResponse xmlns:ns="http://ws.apache.org/axis2"><ns:return>Hello Christophe !</ns:return></ns:echoResponse>
    D'où ma question : A-t-on vraiment un client RESTful dans le premier cas ?

    J'ai également pu lire qu'il fallait modifier une ligne du fichier axis2.xml pour que le serveur Axis2 supporte REST, à savoir remplacer
    <parameter name="disableREST" locked="false">false</parameter>
    par
    <parameter name="enableREST" locked="false">true</parameter>
    Je dois dire que je ne vois pas vraiment la différence entre mettre à false une propriété disable et mettre à true une propriété enable...

    Le second tutorial propose un client permettant de consommer le service web RESTful Yahoo Search que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    package clientrest;
    
    import javax.xml.stream.FactoryConfigurationError;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamWriter;
    
    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.Constants;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;
    
    public class ClientRESTYahooSearch {
    	private static String EPR = "http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=DemoAxis2RESTYahoo&results=5&query=rest&region=fr";
    	
    	private static OMElement getPayload() {
    		OMFactory fac = OMAbstractFactory.getOMFactory();
    		OMElement noeud = fac.createOMElement("localname", null);
    
    		return noeud;
    	}
    
    	public static void main(String[] args) {
    		try {
    			Options options = new Options();
    
    			options.setTo(new EndpointReference(EPR));
    			options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
    			options.setProperty(Constants.Configuration.HTTP_METHOD, Constants.Configuration.HTTP_METHOD_GET);
    
    			ServiceClient sender = new ServiceClient();
    
    			sender.setOptions(options);
    
    			OMElement result = sender.sendReceive(getPayload());
    			XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
    
    			result.serialize(writer);
    			writer.flush();
    		} catch(AxisFault e) {
    			e.printStackTrace();
    		} catch(XMLStreamException e) {
    			e.printStackTrace();
    		} catch(FactoryConfigurationError e) {
    			e.printStackTrace();
    		}
    	}
    }
    Celui-ci fonctionne très bien, mais je n'ai pas trouvé moyen d'adapter le client pour consommer un autre type de service web RESTful (par exemple Google Maps). Peut-on accéder de manière générique à un service web RESTful, à l'image de ce que propose org.apache.axis2.client pour Axis (classes Call et Service) ou encore org.apache.axis2.client pour Axis2 (classes Options et ServiceClient) ?

    Enfin, je n'ai rien trouvé concernant l'implémentation d'un service web RESTful avec Axis2 (seulement à propos de clients), connaîtriez-vous un tutorial à ce sujet ?

    Merci à vous.

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par Arnaud_03 Voir le message
    Celui-ci fonctionne très bien, mais je n'ai pas trouvé moyen d'adapter le client pour consommer un autre type de service web RESTful (par exemple Google Maps). Peut-on accéder de manière générique à un service web RESTful, à l'image de ce que propose org.apache.axis2.client pour Axis (classes Call et Service) ou encore org.apache.axis2.client pour Axis2 (classes Options et ServiceClient) ?
    A priori le code de ce client me semble bel et bien générique car j'arrive à accéder à plusieurs services web (RESTful ou SOAP) et je viens de me rappeler que le service Google Maps n'est pas accessible d'une application non web :
    The Google Maps API is currently available only for websites.

  5. #5
    Membre confirmé Avatar de toomsounet
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 481
    Points : 576
    Points
    576
    Par défaut
    Up je suis tombé sur ce topic en cherchant de la doc sur Restful justement

    Pour ta question "A-t-on vraiment un client RESTful dans le premier cas ?" Je pense que c'est assez trivial de faire un client. Pour yahoo search, une simple utilisation de l'api HttpClient suffit pour récuperer le fichier xml et le parser. Est ce que cela suffit pour tous types d'appels? Je le crois.

    La partie la plus intéressante étant de créer ses propres services.
    "Most Java programs are so rife with concurrency bugs that they work only by accident"

Discussions similaires

  1. Heberger un Service Web REST en Java
    Par timite dans le forum Services Web
    Réponses: 2
    Dernier message: 30/10/2013, 19h04
  2. Réponses: 2
    Dernier message: 31/07/2013, 23h47
  3. Réponses: 8
    Dernier message: 25/01/2012, 00h05
  4. Implémenter un service web RESTful
    Par Arnaud_03 dans le forum Services Web
    Réponses: 4
    Dernier message: 21/04/2009, 18h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo