Précédent   Forum des professionnels en informatique > Général Développement > Conception > Architecture > REST
REST Forum d'entraide sur les architectures REST (Representational State Transfer), les concepts, problématiques et solutions technologiques mettant en oeuvre les principes REST
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2008, 16h45   #1
Membre actif
 
Inscription : juin 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 207
Points : 173
Points : 173
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 :
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à...
Arnaud_03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2008, 17h06   #2
Membre expérimenté
 
Inscription : juillet 2007
Messages : 694
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 694
Points : 508
Points : 508
Je te conseille de chercher du côté du framework Restlet.
verbose est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2008, 11h08   #3
Membre actif
 
Inscription : juin 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 207
Points : 173
Points : 173
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 :
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 :
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) :
Citation:
<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
Citation:
<parameter name="disableREST" locked="false">false</parameter>
par
Citation:
<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 :
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.
Arnaud_03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2008, 11h26   #4
Membre actif
 
Inscription : juin 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 207
Points : 173
Points : 173
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 :
Citation:
The Google Maps API is currently available only for websites.
Arnaud_03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2009, 18h06   #5
Membre éprouvé
 
Avatar de toomsounet
 
Inscription : janvier 2005
Messages : 481
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : janvier 2005
Messages : 481
Points : 495
Points : 495
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"
toomsounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h03.


 
 
 
 
Partenaires

Hébergement Web