Consumir servicio web soap


([N2] celsoeuro) #1

Hola tengo que consumir el siguiente servicio web mediante mensajes soap y no se como hacerlo. el proveedor me da esto:
Por ejemplo, para la operación EstadoActualVehiculoPorMatricula el mensaje SOAP será de la siguiente forma:
POST /Servicios/EstadoVehiculo.asmx HTTP/1.1
Host: www.flotasnet.comg
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: “http://212.8.96.37/webservices/EstadoActualVehiculoPorMatricula
<?xml version=“1.0” encoding=“utf-8”?>
<soap:Envelope xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Header>
<AuthHeader xmlns=“http://212.8.96.37/webservices/”>
<Username>string</Username>
<Password>string</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<EstadoActualVehiculoPorMatricula xmlns=“http://212.8.96.37/webservices/”>
<empresa>string</empresa>
<listaMatriculas>
<string>string</string>
<string>string</string>
</listaMatriculas>
</EstadoActualVehiculoPorMatricula>
</soap:Body>
</soap:Envelope>

Desde soporte me dicen que lo haga con la clase XMLHttpRequest, pero llevo dias viendolo y no se por donde empezar


([N2] huntergps) #2

Hola,

dado que clase XMLHttpRequest tiene, digamos sus complicaciones yo hice una pequeña adaptación a como buena parte de las herramientas js manejan el hacer peticiones web:

https://github.com/Heavyblade/vajax

ahi podrás ver que hay un ejemplo de hacer una petición POST con xml en cuerpo

Un saludo,


([N3] pacosatu) #3

Hola celsoeuro.

Tienes un montón de ejemplos en Internet del uso de XMLHttpRequest, ya que es un componente que existe en prácticamente todos los entornos de programación de alto nivel.

Pon el código que estás usando e intentaremos ayudarte.

Saludos
Paco Satué


([N2] celsoeuro) #4

Hola.
Gracias a huntersgps y a Paco Satué por sus rápidas respuestas.
Bueno entre lo que me dijisteis ambos mas la ayuda del administrador del webservice he conseguido armar este proceso que he puesto en un manejador de evento y llamarlo desde un boton.
importClass(“XMLHttpRequest”);
function soap() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open(‘POST’, ‘http://www.flotasnet.com/Servicios/EstadoVehiculo.asmx?op=EstadoActualFlota’, true);

        // build SOAP request
                
                //Declaracion de variables
                var usuario;
                var pass;
                var empresa;
							
                //Asignacion de variables
                usuario = 'Vigo';
                pass = 'Vigo';
                empresa = 'ero';
	    var matricula = theRoot.varToString("VMATRICULA");
				
					
        var sr =
            '&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://212.8.96.37/webservices/"&gt;'+
                          '&lt;soapenv:Header&gt;'+
                                '&lt;web:AuthHeader&gt;'+
                                    '&lt;web:Username&gt;'+usuario+'&lt;/web:Username&gt;'+
                                    '&lt;web:Password&gt;'+pass+'&lt;/web:Password&gt;'+
                                    '&lt;web:Empresa&gt;'+empresa+'&lt;/web:Empresa&gt;'+
                                '&lt;/web:AuthHeader&gt;'+
                          '&lt;/soapenv:Header&gt;'+
						  
							'&lt;soapenv:Body&gt;'+
                                '&lt;web:EstadoActualVehiculoPorMatricula&gt;'+
                                    '&lt;web:empresa&gt;'+empresa + '&lt;/web:empresa&gt;'+
				' &lt;web:listaMatriculas&gt; ' +
					' &lt;!--Zero or more repetitions:--&gt;' +
					' &lt;web:string&gt;' + matricula + '&lt;/web:string&gt;'+
   					' &lt;/web:listaMatriculas&gt; ' +
                                '&lt;/web:EstadoActualVehiculoPorMatricula&gt;'+
                          '&lt;/soapenv:Body&gt;'+
				'&lt;/soapenv:Envelope&gt;';

        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                   // Respuesta a la peticion
                       alert(xmlhttp.response);
                }
            }
        }
        // Send the POST request
        xmlhttp.setRequestHeader('Content-Type', 'text/xml');
        xmlhttp.send(sr);
    respuesta =xmlhttp.response
        // send request

        // ...
    }

Ya no me da ningun problema cuando lo ejecuto, Pero tampoco me devuelve nada en respuesta. Veis algún fallo?


([N1] cristianvg2003) #5

Buenas,

Ahora que tomo tu codigo y lo pego en un editor las commillas que estas usando me aparecen backtick en lugar de comillas simples, no sé si sea solo tema de copiar-pegar o realmente tienes el codigo asi, la herramienta que valida los scripts te dice que el script esta correcto ?


([N3] pacosatu) #6

Hola Cristian.

No te fies del copia y pega desde la página del foro, siempre hay problemas con comilas dobles o simples.

Saludos
Paco Satué


([N3] alfabeta) #7

Te coloco un código funcional, que preguntando a Soporte más me demoré en encontrar respuestas, que buscando en la web, este código está ubicado en un manejador de evento. Y el archivo adjunto es en una herramienta SoapUI que puedes colocar la url de consulta que debe entregarte el proveedor, con esto la herramienta te presenta la cabecera y el cuerpo a enviar como parámetro con XMLHttpRequest.
Nota: La recuperación de fechas tuve problemas pero eso es en Velneo no mas.

Espero te sirva.

importClass(“XMLHttpRequest”);
// Para usar las funciones de la clase VFile primero hay que importarla
importClass( “VTextFile” );
importClass( “VFile” );

// Se declara el objeto fichero
var fi = new VTextFile( “C:/TextFile.txt” );

var url=‘http://agendamiento.hospitalariasec.org/consultaragenda.aspx?WSDL’;
var xhr = new XMLHttpRequest();

xhr.open(“POST”, url, true);
xhr.setRequestHeader(‘Content-Type’, ‘text/xml’);
//Recupera varibles de fechas
var formulario = theRoot.dataView(),
var fechaDesde = theRoot.varToString(“FCH_DES”),
var fechaHasta = theRoot.varToString(“FCH_HAS”);
// build SOAP request
var sr = ‘<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:agen=“Agenda”>’+
‘<soapenv:Header/>’ +
‘<soapenv:Body>’ +
‘<agen:ConsultarAgenda.Execute>’ +
‘<agen:Desdefecha>’ + fechaDesde + ‘</agen:Desdefecha>’ +
‘<agen:Hastafecha>’+ fechaHasta + ‘</agen:Hastafecha>’ +
‘</agen:ConsultarAgenda.Execute>’ +
‘</soapenv:Body>’ +
‘</soapenv:Envelope>’ ;

alert(sr)
xhr.send(sr);

// Al ser una llamada asíncrona, esperamos a que la petición termine
while(xhr.readyState != 4) { // 4: Done
xhr.processEvents();
}

if ( (xhr.errorCode==0) && (xhr.status == 200) ) {
alert((xhr.response));
// Se abre el fichero en modo escritura. Crea si no existe o limpia si existe
if ( fi.open( VFile.OpenModeWriteOnly | VFile.OpenModeTruncate) )
{
// Se llena el buffer con las 26 letras del abecedario
fi.write(xhr.response);

	// Se cierra el fichero
	fi.close();
}
else
	// Si no ha sido posible abrir el fichero se muestra error
	alert( "No se pudo abrir el fichero " + fi.fileName() + ", error " + fi.error(), "Error" );

}

Ecuador Quality Systems
Quito - Ecuador
Ricardo G.