Note:
Testo rimosso dalla rev 2 e
Testo aggiunto nella rev3
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 daIRB, 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 => nilMh..
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' endUn 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.