🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
2 messages
2 total messages Started by David Serrano (Hue-Bond) Sun, 06 Aug 2006 23:08
(Largo) SOAP con javascript
#914
Author: 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
Re: (Largo) SOAP con javascript
#877
Author: David Serrano (Hue-Bond)
Date: Sun, 17 Sep 2006 23:00
25 lines
1946 bytes
David Serrano (Hue-Bond), lun20060807@01:08:27(CEST):
>

Me respondo a mí mismo:


> 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

Aquí falta una primera línea tal que "HTTP/1.1 200 OK". Parece que el web
service no la envía. Lo he puesto a capón y conseguí que el código javascript
pase de este punto (aparezcan cosas en responseXML) y se estrelle un poco más
adelante ;^).


-- 
 David Serrano - http://hue-bond.blogspot.com
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads