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

Services Web Java Discussion :

web services RESTful


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut web services RESTful
    Bonjour,
    Je suis débutant avec les web services RESTful et je voudrais savoir si quelqu'un peut m'aider avec ça.
    J'ai construit un simple web service RESTful qui fait la somme de deux entiers (grâce à une méthode annotée @POST) et je voudrais savoir comment construire un client qui peut consommer ce service (invoquer le service à partir d'une classe java).
    Voici le code de mon service:

    package somme;


    import javax.ws.rs.FormParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.GET;

    @Path ("/sommer")
    public class somme {



    @POST
    public int add(@FormParam("x") int x, @FormParam("y") int y){
    return x+y;


    }

    }

  2. #2
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Salut

    Je connais pas restFul mais je pense que le principe est le même.

    Ton web service ---> wsdl de ton web service ---> générer un client à partir du WSDL.
    Tu crées une classe pour utiliser tes classes client.

    Bon, c'est aussi simple que si tu utilise eclipse ou netbeans. C'est plus chiant en ligne de code.

    Tu déploies ton web service sur un serveur puis tu testes ton client.

    Je suis peu précis car je sais pas ou t'en est exactement.
    Si tu veux des précisions, je suis là.

  3. #3
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    salut,
    Les services Web RestFull sont orientés ressources (uri), Pour le descripteur c'est plûtot un wadl à la place du wsdl.
    Pour un client Rest, tu pourrais développer un client http. Sinon tu as des outils récents comme wadl2java qui devrait remplacer wsdl2java.

  4. #4
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    T'a réussit à résoudre ton problème ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut :(
    Non pas encore, en fait ce que je vais faire c'est récupérer les valeurs de x et y à partir du client et puis lui renvoyer la somme. Je sais pas comment faire pour envoyer les valeurs de x et y du client vers le service

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    Je vous ai déjà envoyé le code de mon service je vous envoie le code de mon client:
    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
     
    package testClient;
     
     
    import java.net.URI;
     
     
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.UriBuilder;
    import javax.ws.rs.core.MultivaluedMap;
     
    import com.sun.jersey.api.client.Client;
    import com.sun.jersey.api.client.ClientResponse;
    import com.sun.jersey.api.client.WebResource;
    import com.sun.jersey.api.client.config.ClientConfig;
    import com.sun.jersey.api.client.config.DefaultClientConfig;
    import com.sun.jersey.core.util.MultivaluedMapImpl;
     
    public class test {
    	public static void main(String[] args) {
    		ClientConfig config = new DefaultClientConfig();
    		Client client = Client.create(config);
    		WebResource service = client.resource(getBaseURI());
     
     
     
     
    		 MultivaluedMap<String, String> formData = new MultivaluedMapImpl();
     
    		formData.add("x", "5");
    		formData.add("y", "2");
     
    		  ClientResponse response = service.path("sommer/add").post(ClientResponse.class);
     
     
    		  String entity = response.getEntity(String.class);
    		  System.out.println (entity);
    		  System.out.println (response);
     
     
     
    	}
     
     
    	private static URI getBaseURI() {
    		return UriBuilder.fromUri(
    				"http://localhost:8080/test").build();
    	}
     
    }


    voici ce que j'obtiens:
    <html><head><title>JBoss Web/2.1.1.GA - Rapport d'erreur</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>Etat HTTP 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Rapport d'exception</p><p><b>message</b> <u></u></p><p><b>description</b> <u>Le serveur a rencontr� une erreur interne () qui l'a emp�ch� de satisfaire la requ�te.</u></p><p><b>exception</b> <pre>java.lang.NumberFormatException: For input string: &quot;x&quot;
    java.lang.NumberFormatException.forInputString(Unknown Source)
    java.lang.Integer.parseInt(Unknown Source)
    java.lang.Integer.parseInt(Unknown Source)
    somme.somme.add(somme.java:22)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:167)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:86)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1347)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1279)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1219)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:419)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    </pre></p><p><b>note</b> <u>La trace compl�te de la cause m�re de cette erreur est disponible dans les fichiers journaux de JBoss Web/2.1.1.GA.</u></p><HR size="1" noshade="noshade"><h3>JBoss Web/2.1.1.GA</h3></body></html>
    POST http://localhost:8080/test/sommer/add returned a response status of 500


    Ce que j'ai compris c'est que mon service n'arrive pas à récupérer les valeurs de x et y à partir du client, car quand je fais entrer ces valeurs directement dans la méthode de service, il envoie le réponse au client et je peux la récuperer. Par exemple dans le cas où je passe la valeur 2 à x et 1 à y dans mon code service voici ce que j'obtiens quand j'éxécute mon client:

    3
    POST http://localhost:8080/test/sommer/add returned a response status of 200

    je récupère la valeur 3 et la requête a réussi

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    pleaaase help me ((

  8. #8
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    C'est vrai que sans tester de mon côté c'est assez dure mais je vais essayer de te lancer sur quelques piste.

    t'a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.NumberFormatException: For input string: &quot;x&quot;
    Dans ton WSDL tu as les variables et leurs description. Regarde les types et leurs longueurs. C'est manuel, c'est chiant, mais ça peut aider.

    essai ("x", 5)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    Veux tu que je t'envoie le codes , les jars à ajouter et ce que tu dois faire pour pouvoir tester de ton côté?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    c'est bon, j'ai oublié de passer formData en paramètre à post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClientResponse response = service.path("sommer/add").post(ClientResponse.class,formData);
    maintenat ça marche

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut Message Body Writer :s
    Maintenant, j'ai un autre problème
    au lieu de passer x et y comme String je veux les passer comme int

    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
     
    package somme;
     
     
    import javax.ws.rs.FormParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.GET;
     
    @Path ("/sommer")
    public class somme {
     
    	@Produces("text/plain")
    	@GET
    	public String hello () {return "salut";}
     
     
    	@Path("/add")
    	@POST
    	public String add(@FormParam("x")String x,@FormParam("y")String y){
     
    		String s = String.valueOf(Integer.parseInt(x)+Integer.parseInt(y));
    	   return s;}
     
     
    	@Path ("/addInt")
    	@POST
    	public int addInt (@FormParam("a") int a ,  @FormParam ("b") int b ) { 
    		int  sum = a+b ;
    		 return sum ;
     
    	}
     
     
     
     
     
    }
    Quand j'exécute celà sur le serveur j'obtiens une exception:

    GRAVE: Mapped exception to response: 500 (Internal Server Error)
    javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.lang.Integer, and Java type int, and MIME media type application/octet-stream was not found

    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1316)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1219)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:419)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)
    Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class java.lang.Integer, and Java type int, and MIME media type application/octet-stream was not found

    Ce sont mes premiers pas et je me sens un peu perdu

  12. #12
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Je voix rien de choquant dans ton code.
    Moi j'ai ça qui marche. Mais c'est sous netbeans avec METRO. Je te garantie pas son fonctionnement. Peux-tu me dire dans avec quels outils tu travailles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        @WebMethod(operationName = "add")
        public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
            //TODO write your implementation code here:
            return i+j;
        }

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    Je suis sous eclipse et je travaille avec une implémentation de référence de JAX-RS qui est Jersey (j'ajoute les lib de jersey à mon projet (des .jar)).
    Vous êtes avec JAX-WS là , il y a peut être quelques diffèrences.Il ya les Message Body Reader et les Message Body Writer mais je ne sais pas exactement comment faire!!!

  14. #14
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Ton code précédent me choque pas, de plus si t'arrive à faire marcher les strings pourquoi ça marcherait pas pour les int ?

    ça viens peut-être de ton appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		 
    MultivaluedMap<int, int> formData = new MultivaluedMapImpl();
    		  
    		formData.add("x", 5);
    		formData.add("y", 2);
    		 
    		  ClientResponse response = service.path("sommer/addInt").post(ClientResponse.class);

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    Non en fait le problème n'est pas causé par l'appel, déjà l'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MultivaluedMap<int, int> formData = new MultivaluedMapImpl()
    n'est pas accepté pas le compilateur :
    Syntax error on token "int", Dimensions expected after this token

    et si tu remplaces int par Integer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MultivaluedMap<Integer, Integer> formData = new MultivaluedMapImpl()
    ça ne lui plaît pas non plus

    Type mismatch: cannot convert from MultivaluedMapImpl to MultivaluedMap<Integer,Integer>


    et même si je remplace ça avec:

    MultivaluedMapImpl formDataInt = new MultivaluedMapImpl();

    ça ne marche pas non plus.

    J'ai lu quelque part:
    "JAX-RS/Jersey does not support the serialization of primitive types (or their Object counter parts).

    If you want to support such types you need to implement your own message body writer and also declare an appropriate media type with that writer (the content-type of the response will use that, if @Produces does not declare it)."

    Mais je ne sais pas comment faire cela

Discussions similaires

  1. Décrire et Consommer un Web Service ReST
    Par knebhi dans le forum REST
    Réponses: 8
    Dernier message: 28/10/2012, 15h10
  2. web services REST
    Par mafanta dans le forum Services Web
    Réponses: 1
    Dernier message: 08/02/2011, 08h44
  3. web service restful
    Par linda2010 dans le forum Services Web
    Réponses: 0
    Dernier message: 07/03/2010, 23h51
  4. Web service REST
    Par Lexandre dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 27/01/2010, 10h31
  5. Problème FLEX Web Service REST
    Par Florian_44 dans le forum Flex
    Réponses: 1
    Dernier message: 25/06/2009, 00h58

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