J'essaie d'appeler un service web depuis une page PHP via un script en Ruby. Le script PHP renvoie une chaîne de caractères et appelle lui-même un autre service web ; j'ai testé le script PHP seul et il renvoie une seule chaîne de caractères. J'essaie d'appeler cette méthode via RPC en utilisant le code suivant :
require 'soap/rpc/driver'
driver = SOAP::RPC:Driver.new('http://mysite.com/services/webservices.php', 'urn:mysite')
driver.add_method('getMobileCarrier', 'phoneNumber')
driver.getMobileCarrier('15551234567') # fake number, obviously
Je reçois ce résultat :
REXML::ParseException: malformed XML: missing tag start
Line:
Position:
Last 80 unconsumed characters:
< in <b>/var/www/html/services/webservices.php</b>
from /opt/local/lib/ruby/1.8/rexml/parsers/baseparser.rb:356:in `pull'
from /opt/local/lib/ruby/1.8/rexml/parsers/streamparser.rb:16:in `parse'
from /opt/local/lib/ruby/1.8/rexml/document.rb:201:in `parse_stream'
from /opt/local/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:27:in `do_parse'
from /opt/local/lib/ruby/1.8/soap/parser.rb:92:in `parse'
from /opt/local/lib/ruby/1.8/soap/processor.rb:39:in `unmarshal'
from /opt/local/lib/ruby/1.8/soap/rpc/proxy.rb:236:in `unmarshal'
from /opt/local/lib/ruby/1.8/soap/rpc/proxy.rb:175:in `route'
from /opt/local/lib/ruby/1.8/soap/rpc/proxy.rb:141:in `call'
from /opt/local/lib/ruby/1.8/soap/rpc/driver.rb:178:in `call'
from /opt/local/lib/ruby/1.8/soap/rpc/driver.rb:232:in `getMobileCarrier'
from (irb):4
Cependant, lorsque j'exécute le code PHP lui-même (et que je lui donne une valeur réelle, évidemment), il ne génère aucune erreur et renvoie la valeur attendue. Cela ne fonctionne pas avec Ruby et REXML ; comment puis-je résoudre ce problème ? Le service web que le script PHP appelle est celui d'un tiers et je ne peux pas modifier la réponse, mais il est évident que la réponse fonctionne bien en PHP mais que REXML a un problème avec elle.