2008-10-16 13 views

Respuesta

17

Puede consumir un servicio web utilizando JavaScript de forma nativa utilizando el objeto XmlHttpRequest. Sin embargo, crear instancias de este objeto varía según el navegador. Por ejemplo, Firefox e IE 7+ le permiten crear una instancia como un objeto JavaScript nativo, pero IE6 requiere que lo instancia como un control ActiveX.

Debido a esto, recomiendo usar una biblioteca de abstracción como jQuery. Si no es una opción, abstraiga la creación en un método de fábrica y verifique la versión del navegador.

Para usar esto para realizar una llamada al servicio web simplemente crea una instancia del objeto y luego llame al método open(). Recomiendo que esto se haga de manera sincronizada para mantener la UI receptiva. Cuando se invoca de manera asíncrona, recibirá devoluciones de llamada a su método asíncrono especificado que indicará el estado de la solicitud. Cuando el estado es 4 (cargado) puede tomar los datos de respuesta y luego procesarlos.

Cómo procesa los datos dependerá de qué se trate, si es JSON, puede ejecutarlo a través del método eval() de JavaScript, pero eso tiene algunas implicaciones de seguridad. Si es XML, puede usar el XML DOM para procesarlo.

Consulte Wikipedia para obtener más información sobre el objeto XMLHttpRequest.

+0

Simplemente curioso. ¿Era JavaScript capaz de llamar a las API/servicios web antes de que XHR apareciera en el idioma o hasta ese momento solo * para la manipulación DOM en páginas HTML? – RBT

2

Puede usar el objeto XMLHttpRequest, pero como no desea utilizar ningún marco de JavaScript, deberá ordenar y desempaquetar los sobres SOAP usted mismo.

+1

Solo tiene que preocuparse por los sobres SOAP si se trata de un servicio web SOAP. Se pueden llamar algunos servicios web tranquilos y leer los resultados sin ningún procesamiento previo. – brien

5

Puede crear un XMLHttpRequest si el servicio está alojado dentro de su dominio. De lo contrario, tendrá problemas entre dominios.

+0

s/could/will/si no me equivoco. –

+0

Sí, tienes razón. Cada vez que surgen cosas de dominios cruzados, me pregunto cuáles son las reglas exactas. Solo trato de evitar esos problemas por completo;) – brien

+0

¿Qué quiere decir, específicamente, por "problemas entre dominios"? –

0

También verifique XML HTTP Request para obtener una buena página de información sobre el uso del objeto XmlHttpRequest.

0

Hay una pequeña biblioteca escrita en javascript que se puede utilizar como cliente XML-SOAP. No sé si funciona en todos los navegadores, pero podría ser útil. Puede encontrarlo here

0

Esto funcionó. Es viejo (buscando Netscape), fue escrito antes de que salieran todas las herramientas de Ajax. Tienes que manejar diferentes navegadores, básicamente, IE lo hace de una manera, y todos los demás lo hacen de otra manera.

// javascript global variables 
var soapHeader = '<?xml version=\"1.0\"?>' 
       + '<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"' 
       + ' SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"' 
       + ' xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\"' 
       + ' xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\"' 
       + '>' 
       + '<SOAP-ENV:Header/>' 
       + '<SOAP-ENV:Body>'; 

var soapFooter = '</SOAP-ENV:Body>' 
       + '</SOAP-ENV:Envelope>'; 

var destinationURI = '/webservices/websalm'; 

var actionURI = ''; 

function callWebService(nsCallback,ieCallback,parms) { 
    try 
    { 
     // Create XmlHttpRequest obj for current browser = Netscape or IE 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
      SOAPObject = new XMLHttpRequest(); 
      SOAPObject.onload = nsCallback; 
     } else { //IE 
      SOAPObject = new ActiveXObject('Microsoft.XMLHTTP'); 
      SOAPObject.onreadystatechange = ieCallback; 
     } 

     SOAPObject.open('POST', destinationURI, true); 

     // Set 2 Request headers, based on browser 
     if (actionURI == '') { 
      SOAPObject.setRequestHeader('SOAPAction', '\"\"'); 
     } else { SOAPObject.setRequestHeader('SOAPAction', actionURI); 
     } 

     SOAPObject.setRequestHeader('Content-Type', 'text/xml'); 

     // Compose the Request body from input parameter + global variables 
     var requestBody = soapHeader + parms + soapFooter 

     // Send, based on browser 
     if (navigator.userAgent.indexOf('Netscape') != -1) 
     { 
     SOAPObject.send(new DOMParser().parseFromString(requestBody,'text/xml')); 
     } else { 
     SOAPObject.send(requestBody); 
     } 
    } catch (E) 
    { 
    alert('callWebService exception: ' + E); 
    } 
} 
+0

Simplemente curioso. ¿Era JavaScript capaz de llamar a las API/servicios web antes de que XHR apareciera en el idioma o hasta ese momento solo * para la manipulación DOM en páginas HTML? – RBT

Cuestiones relacionadas