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

Ruby on Rails Discussion :

Créer un service Web et communiquer avec une application lourde


Sujet :

Ruby on Rails

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut Créer un service Web et communiquer avec une application lourde
    Bonjour/Bonsoir.

    Je ne sais pas trop si je devais poster dans une partie plus générale mais voici mon problème :

    Je souhaite dévelloper un site avec bdd en RoR qui gère des Artisans et leurs devis. (peu importe pour mon problème mais c'est pour vous mettre en situation) et je voudrais rendre accesible un certain nombres " d'ordres " via une application lourde en Java C++ ou C#. Pour simplifier prenons java

    Je pense à plusieurs solutions mais je ne sais pas du tout si elles sont réalisable d'ou cette discution.

    1)
    Je voudrais savoir s'il faut ou si on peut faire de la programmation distribuée du Service en Rails à l'application Java. Ainsi je pourrais créer des instances qui accèdent à la bdd en remote... (et comment ? )

    2)
    Je me demande s'il est possible de faire un certains nombre de fonction dans mon service web comme :

    def getListeArtisan
    @liste = Artisan.find(:all) #accès à la bdd
    return @liste
    end

    def CréerArtisan(nom,prenom,tel,....)
    @nouveau = Artisan.create(nom,prenom,tel,etc...)
    @nouveau.save
    end

    et de récupérer cette liste (en xml ?) via mon application lourde en disant "je veut le résultat de la fonction getListeArtisan" ou créer un Artisan en disant "je souhaite créer un artisan de nom "DUPONT", prenom "JEAN", etc etc"
    Ainsi il y aurais juste à dire quoi faire au service web et il communique les informations via du code xml....

    3)
    Utiliser la bibliothèque de programmation distribuée Java des deux cotés mais donc réécriture des modèles. On perd la persistance "gratuite" de Rails...et d'autres choses. Je trouve que ca serait dommage d'utiliser cette solution.


    Voila je ne sais pas si je me suis bien fait comprendre mais en gros je voudrais accèder facilement à ma bdd via une application lourde en utilisant un service web rails (et ainsi garder les avantages de ruby on rails). Quelque soit vos réponses je vous dit merci. Rien que des petits élèments de réponses m'aiderais parce que je suis un peu dans l'impasse et ca serait un peu "suicidaire" de se lancer dans le test de la première ou seconde solution sans avoir la moindre idée de comment faire .


    ps : peut-être existe t-il une réponse facile grace à JRuby ?

  2. #2
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Bonjour

    En ce qui concerne ton deuxième point, rien de plus facile, tu vas découvrir que ça se gère en à peu près 5 lignes de code, que le WSDL est généré tout seul, que l'accès ActiveRecord marche parfaitement, et qu'en faisant croire à ton patron que ça t'a pris une semaine, tu vas pouvoir devenir un dieu du démineur

    à la racine de ton appli Rails :

    ruby script/generate web_service ws_test #ws_test est ici le nom de ta classe

    # =>

    create app/apis/ws_test_api.rb
    create app/controllers/ws_test_controller.rb
    create test/functional/ws_test_api_test.rb
    Dans ton fichier ws_test_controller.rb, tu vas placer tes webmethodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def say_hello_to(pseudo)
       texte = "Hello #{pseudo}"
       return text
    end
    Ensuite dans ton ficher ws_test_api.rb, tu vas définir les prototypes de tes webméthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    api_method :say_hello_to,
                        :expects=>[{:pseudo=>:string}],
                        :returns=>[:string]
    Et hop ! Tu as ta première Webméthode. ton WSDL est accessible là :

    http://url_de_ton_serveur/ws_test/wsdl

    Pour complexifier un poil les données renvoyées par un webservice, jettes un oeil du coté de ActionWebService::Struct, qui te permet de créer des classes contenant des structures complexes, et de les renvoyer

    Si tu as besoin de plus d'aide, n'hésites pas.

    PB

    PS : pour le 3 c'est sans doute possible, mais je ne maitrise ni java, ni JRuby, et pour le 1, je n'ai pas compris

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Ha, c'est bien que le WSDL se fasse tout seul .

    Par contre comment je fait dans mon application JAVA pour "demander ce résultat" et le "récupérer" dans une structure JAVA ?


    ----
    Je pensais éventuellement définir une route de la forme
    monserviceweb/fonction1/argument1/argument2/argument3
    et ainsi dire à java d'appeller cette page sous la forme
    http://www.monserver:3000/monservice...rtin@gmail.com

    Mais je ne sais pas si je raconte n'importe quoi ou si c'est possible
    ----

    Merci pour la rapidité de réponse en tout cas

  4. #4
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    La solution que je t'ai donnée marche super bien en utilisant SOAP ou XML-RPX de l'autre coté (là, pour savoir comment ça marche, va falloir aller voir coté java ). Tu peux tout de même avoir plus d'infos sur leur fonctionnement ici : http://manuals.rubyonrails.com/read/chapter/67#page165

    Si tu veux "juste" consulter une URL (faire du REST quoi), et récupérer des données brutes au format XML, tu peux utiliser coté Rails le respond_to dans tes controlleurs, ce qui fait que lorsque du XML sera demandé pour une action donnée, tu lui renverras du XML

    Tu as un bon exemple ici : http://www.ibm.com/developerworks/ja...ary/j-cb08016/ (avec même un exemple d'invocation en java )

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup je vais pencher la dessus et je vous dirais ce que ca donne

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Bon, j'ai tester avec SOAP et ca marche vraiment super bien trop content :]

    Voici comment ca marche ::
    - créer un projet (rails nomduprojet)
    - créer une table personnes dans une base quelconque
    - renseigner le fichier database.yml
    - créer le model personne (ruby script/generate model Personne)
    - créer le service web ( ruby script/generate ruby script/generate web_service wstest lister lister2 creer supprimer supprimerPersonne modifier )
    - modifier les fichiers comme ci-dessous

    Coté Serveur : fichier wstest_controller

    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
    59
    60
    61
    62
    63
    64
    class WstestController < ApplicationController
      wsdl_service_name 'Wstest'
     
      def lister
    	string = ""
    	@liste = Personne.find(:all)
    	@liste.each { |p|
    		string += "#{p.id} #{p.nom} #{p.prenom} #{p.age} #{p.fonction} <br>\n"
    	}
    	return string
      end
     
      def lister2
    	tableau = [] # équivalent à Array.new()
    	@liste = Personne.find(:all)
    	@liste.each{ |p|
    		 tableau << PersonneStruct.new(:nom => p.nom, :prenom => p.prenom,
                 :age => p.age, :fonction => p.fonction, :idd => p.id)
     
    	}	
    	return tableau
     
      end
     
      def creer(nom,prenom,age,fonction)
    	@nouveau = Personne.create(:nom=>nom,:prenom=>prenom,:age=>age,:fonction=>fonction)
     
    	if @nouveau.save()
    		return "#{@nouveau.nom} #{@nouveau.prenom} with id #{@nouveau.id} created \n"	
    	else
    		return "erreur de création \n"		
    	end
     
      end
     
      def supprimer
     
      end
     
      def supprimerPersonne(nom)
    	@personne = Personne.find_by_nom(nom,:limit=>1)
    	if @personne
    		@personne.destroy()
    		return " #{@personne.nom} #{@personne.prenom} destroyed"
    	else
    		return " erreur de destruction"
    	end
      end
     
      def modifier(id,nom,prenom,age,fonction)
    	@personne = Personne.find(id)
    	if @personne
    		@personne.nom = nom
    		@personne.prenom = prenom
    		@personne.age = age
    		@personne.fonction = fonction
    		@personne.save()
    		return "personne changed to #{@personne.nom} #{@personne.prenom} #{@personne.age} #{@personne.fonction} \n"
     
    	else
    		return "erreur de modification"
    	end
      end
    end
    wstest.api
    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
     
    class WstestApi < ActionWebService::API::Base
     
    class PersonneStruct < ActionWebService::Struct
      member :nom, :string
      member :prenom, :string
      member :age, :integer
      member :fonction, :string
      member :idd, :integer
    end
     
      api_method :lister,:returns=>[:string]
      api_method :lister2,:returns => [[PersonneStruct]]
     
     
      api_method :creer,:expects=>[{:nom=>:string},{:prenom=>:string},{:age=>:integer},{:fonction=>:string}],
                        :returns=>[:string]
      api_method :supprimer,:expects=>[{:id=>:integer}],
                        :returns=>[:string]
      api_method :modifier,:expects=>[{:id=>:integer},{:nom=>:string},{:prenom=>:string},{:age=>:integer},{:fonction=>:string}],
                        :returns=>[:string]
     
      api_method :supprimerPersonne,:expects=>[{:nom=>:string}],:returns=>[:string]
     
     
    end
    personne.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Personne < ActiveRecord::Base
    end
     
    class PersonneStruct < ActionWebService::Struct
      member :nom, :string
      member :prenom, :string
      member :age, :integer
      member :fonction, :string
      member :idd, :integer
    end

    Créer un fichier clientsoap.rb (touch clientsoap.rb) dans un autre dossier (pas obligé mais bon)
    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
    require 'soap/wsdlDriver'
    driver =SOAP::WSDLDriverFactory.new("http://localhost:3000/wstest/wsdl").create_rpc_driver
     
     
    #methode lister
    resultat1 = driver.lister()
    puts "******* methode lister() ************************** \n"
    puts resultat1
    puts "*************************************************** \n"
     
     
    #ajouter Bos Stephen
     
    puts "************ creer(Bos,Stephen20,DevWeb) ******** \n"
    ajouter = driver.creer("BOS","Stephen",20,"DevWeb")
    puts ajouter
    puts "************************************************* \n"
     
     
    #methode lister2
    resultat2 = driver.lister2()
    puts "******* methode lister2() *********************** \n"
    resultat2.each do |p|
      puts " [#{p.idd}] => #{p.nom} \t #{p.prenom} \t #{p.age} \t #{p.fonction} \n "
    end
    puts "************************************************* \n"
     
    #supprimer Bos Stephen
    puts "************ supprimerPersonne(Bos) ******** \n"
    supprimer = driver.supprimerPersonne("BOS")
    puts supprimer
    puts "************************************************* \n"
     
    #modifier le Bos Restant
    puts "************ modifier(Bos) ******** \n"
    modifier = driver.modifier(1,"HEITZ","Fabriz","23","grand CHEF")
    puts modifier
    puts "************************************************* \n"
     
     
     
    #methode lister3
    resultat3 = driver.lister2()
    puts "******* methode lister3() *********************** \n"
    resultat3.each do |p|
      puts " [#{p.idd}] => #{p.nom} \t #{p.prenom} \t #{p.age} \t #{p.fonction} \n "
    end
    puts "************************************************* \n"

    - lancer le server (il faut etre dans le dossier du serv) => ruby script/server
    - lancer le client (il faut etre dans le dossier du client) => ruby clientsoap.rb

    Résultat client :

    fabseven@heitz-desktop:~/rails/client$ ruby clientsoap.rb
    ******* methode lister() **************************
    1 HEITZ Fabrice 23 Chef de projet <br>
    2 DOLLINGER Jean-François 20 Assistant Chef de projet <br>
    4 BOS Stephen 20 DevWeb <br>
    ***************************************************
    ************ creer(Bos,Stephen20,DevWeb) ********
    BOS Stephen with id 8 created
    *************************************************
    ******* methode lister2() ***********************
    [1] => HEITZ Fabrice 23 Chef de projet

    [2] => DOLLINGER Jean-François 20 Assistant Chef de projet

    [8] => BOS Stephen 20 DevWeb

    [4] => BOS Stephen 20 DevWeb

    *************************************************
    ************ supprimerPersonne(Bos) ********
    BOS Stephen destroyed
    *************************************************
    ************ modifier(Bos) ********
    personne changed to HEITZ Fabriz 23 grand CHEF
    *************************************************
    ******* methode lister3() ***********************
    [1] => HEITZ Fabriz 23 grand CHEF

    [2] => DOLLINGER Jean-François 20 Assistant Chef de projet

    [4] => BOS Stephen 20 DevWeb

    *************************************************
    Plutot facile non ?

    Remarque : je n'ai pas fait de gestion d'erreur, ni d'interface, ni de timeout pour le moment mais je vais voir pour faire un truc en GTK prochainement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer un service web en connexion avec une BDD
    Par mouned dans le forum Services Web
    Réponses: 5
    Dernier message: 30/03/2012, 20h27
  2. Communiquer avec une application cliente
    Par Invité dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 01/06/2011, 17h27
  3. communiquer avec une application c++
    Par maa dans le forum C#
    Réponses: 10
    Dernier message: 25/10/2010, 10h13
  4. Communiquer avec une application en arrière plan
    Par ZMJUVENTINO dans le forum Général Java
    Réponses: 4
    Dernier message: 11/02/2009, 15h39
  5. Communiquer avec une application
    Par ZMJUVENTINO dans le forum Général Java
    Réponses: 3
    Dernier message: 28/01/2009, 01h40

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