🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #914

(Largo) SOAP con javascript

#914
From: David Serrano (Hue-Bond)
Date: Sun, 06 Aug 2006 23:08
86 lines
4771 bytes
Estoy intentando llamar a una función remota vía SOAP desde javascript. Uso
un cliente (*) de SOAP que encontré en guru4.net[1], al que me referiré como
soapclient.js. El servicio está implementado en Perl y funciona(TM). Es
decir, haciendo otro programita en Perl que llame a una función, obtengo el
resultado deseado sin errores ni nada. Puedo copypastear código si hace
falta, pero no creo que sea relevante.

Sin embargo con javascript no me funciona del todo bien. Este es el código
que estoy usando. El URI es '/~hue/perl/temp' y la función que estoy
llamando es 'f2c' ("fahrenheit to celsius"):

----------------- hw.html
<html><head>
<script type="text/javascript" src="soapclient.js"></script>
<script type="text/javascript" src="hw.js"></script>
</head></html>
-----------------

----------------- hw.js
function cb(r) {
	alert (r);
}

var params = new SOAPClientParameters ();
params.add ('fahrenheit', 212);
SOAPClient.invoke ('/~hue/perl/temp', 'f2c', params, false, cb);
-----------------

La función cb ("callback") no se dispara. Si me voy a la consola javascript
de Mozilla, me encuentro un precioso error "document has no properties", que
se produce en soapclient.js:206. La línea 206 es:

return document.getElementsByTagName(tagName);

Y ahora a ver cómo me explico: "document" es el primer parámetro de la
función en la que se encuentra esa línea. Quien llama a esa función, lo hace
con un primer parámetro tal que "req.responseXML" (línea 177). A su vez, ese
"req" es un parámetro, que en la función llamante (línea 166) es un objeto
xmlHttp (xmlHttp es una abstracción de soapclient.js, que se encarga de
llamar al objeto real independientemente del navegador que usemos).

Indagando, me encontré con que la propiedad (**) responseXML de ese objeto
xmlHttp no tiene nada, y por eso llamar a getElementsByTagName se rompe.
Entiendo que falle, pero no entiendo por qué req.responseXML está vacío. Si
no me equivoco, en req.responseXML debería encontrarse la respuesta XML
devuelta por el servicio SOAP.

Usando tcpdump veo que la respuesta ha pasado por el cable. Rebuscando un
poco más, me encuentro con que en efecto el tocho XML le llega al programa,
pero no en responseXML, sino en responseText. Esto es todo lo que hay en
responseText:

-----------------
Status: 200 OK
Content-Length: 518
Content-Type: text/xml; charset=utf-8
SOAPServer: SOAP::Lite/Perl/0.60

<soap-env:envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"><soap-env:body><namesp17:f2cresponse
xmlns:namesp17="urn:Temperatures"><s-gensym43
xsi:type="xsd:int">100</s-gensym43></namesp17:f2cresponse></soap-env:body></soap-env:envelope>
-----------------

Es decir, está la respuesta devuelta por apache, tal cual (o algo muy
parecido). Y en la última línea se ve el "100", que es el resultado correcto
de la petición. El mensaje apenas difiere de la respuesta que se devuelve
cuando ataco al servicio usando Perl.

¿Por qué no hay nada en responseXML? ¿Estoy haciendo algo mal? ¿Puede tener
algo que ver el WSDL que describe a mi servicio (que lo tuve que crear yo)?

Si se necesitan más detalles, los tengo. Gracias!


(*)  O biblioteca, o como se diga. Estoy muy pez en javascript.
(**) O método, que sinceramente no lo sé.

Referencias:
 1. http://www.guru4.net/articoli/javascript-soap-client/

-- 
 David Serrano
Technical Details
Message-ID: <slrnedctjb.auv.responder_solo_en_el_grupo@genus.hue-bond.info>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news.glorb.com!proxad.net!u-picardie.fr!news.ecp.fr!appleseed.escomposlinux.org!cernicalo.escomposlinux.org!escomposlinux.org!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,6991cac082143a26,start
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,UTF8
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news.glorb.com!proxad.net!u-picardie.fr!news.ecp.fr!appleseed.escomposlinux.org!cernicalo.escomposlinux.org!escomposlinux.org!not-for-mail
From: "David Serrano (Hue-Bond)" <responder_solo_en_el_grupo@yahoo.es>
Newsgroups: es.comp.os.linux.programacion
Subject: (Largo) SOAP con javascript
Date: Sun, 6 Aug 2006 23:08:27 +0000 (UTC)
Organization: I work for myself
Lines: 86
Message-ID: <slrnedctjb.auv.responder_solo_en_el_grupo@genus.hue-bond.info>
NNTP-Posting-Host: 124.red-83-40-152.dynamicip.rima-tde.net
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Trace: cormoran.emeteo.local 1154905707 3553 83.40.152.124 (6 Aug 2006 23:08:27 GMT)
X-Complaints-To: emeteo@escomposlinux.org
NNTP-Posting-Date: Sun, 6 Aug 2006 23:08:27 +0000 (UTC)
X-Message-Flag: Visit http://www.debian.org/
X-MSMail-Priority: High
Mail-Copies-To: nobody
User-Agent: slrn/0.9.8.1pl1 (Debian)