Client SOAP da WSDL

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Creare un client SOAP a mano non e’ molto complesso. D’altronde, esiste uno standard, detto WSDL, che ci permette di descrivere in un formato concettualmente semplice dei servizi SOAP.

Una volta ottenuto il wsdl possiamo generare automaticamente un client. In ruby, possiamo usare lo script wsdl2ruby.rb per generare effettivamente del codice da manipolare, oppure possiamo usare una classe, WSDLDriverFactory che ci permette di creare un client a runtime in modo incredibilmente semplice.

Per questo esempio useremo un servizio trovato su xmethods.org, che somiglia ai classici giochi a premi televisivi con domande a risposta multipla.

Proveremo il sistema direttamente da IRB, cercando di imparare dagli errori. La prima cosa da fare e’ caricare SOAP::WSDLDriverFactory e creare un driver:
 >> require "soap/wsdlDriver" 
 => true
 >> url="http://java.rus.uni-stuttgart.de/quiz/quiz.wsdl" 
 => "http://java.rus.uni-stuttgart.de/quiz/quiz.wsdl" 
 >> client = SOAP::WSDLDriverFactory.new(url).createDriver
 => #<SOAP::WSDLDriver:{http://www.themindelectric.com/wsdl/QuizService/}IQuizService>
Piuttosto semplice, no? Nel dettaglio quello che abbiamo fatto : # caricare la classe WSDLDriverFactory # creare un oggetto Factory, cioe’ un oggetto che potra’ poi fabbricare varie istanze di WSDLDriver che usino quell’url. # creare ( con create ) uno di questi oggetti Ora usiamo la potente Reflection di ruby per sapere quali sono i metodi interessanti di questo client:
 >> puts client.methods(false)
 checkCorrectAnswerById
 addNewEntry
 getRandomQuestionByDifficultyLevel
 getRandomQuestion
 getCorrectAnswerForQuestionById
 => nil
Mh.. getRandomQuestion sembra interessante, proviamo a fare una prova:
 >> dom= client.getRandomQuestion
 => #<SOAP::Mapping::Object:0x2d65af8 @answerB="Space Balls", @question="In what
 80's movie will you find the following: a rocketship inside a house, blue grandp
 arents, and a talking pile of dung?", @id=63, @difficultyLevel=16000, @answerC=" 
 The Ice Pirates", @answerA="Weird Science", @answerD="The Neverending Story">
Sembra che abbiamo ottenuto una bella domanda :) a questo punto, avrete capito come funziona, vi faccio vedere un semplice client:
 require "soap/wsdlDriver" 
  url="http://java.rus.uni-stuttgart.de/quiz/quiz.wsdl" 

 client = SOAP::WSDLDriverFactory.new(url).createDriver

 while true 
  d= client.getRandomQuestion
  puts '========'
  puts d.question
  puts 'a: '+d.answerA
  puts 'b: '+d.answerB
  puts 'c: '+d.answerC
  puts 'd: '+d.answerD
  puts 'Premi invio per la risposta giusta..'
  gets
  puts client.getCorrectAnswerForQuestionById(d.id)
  puts 'vuoi proseguire?[s/n]'
  break unless gets.chomp=='s'
 end 
Un ultimo dettaglio: qualsiasi errore viene trasmesso come SOAP::FaultError e potete gestirlo come una qualunque eccezione:
 >>  client.getCorrectAnswerForQuestionById 1000
 SOAP::FaultError: The Id for the Question you provided doesn't exist witin this
 service.
Updated on January 07, 2006 03:53 by Gabriele Renzi (151.37.139.176)