Inserito da: mandev | Settembre 11, 2007

Creazione di un’interfaccia JS per i WebService

Nelle pagine web e negli applicativi web (sia intranet che internet) JS sta acquistando sempre un maggior ruolo. Uno degli utilizzi più interessanti di JS è quello di chiamare WebService (anche in modo asincrono) per recuperare dei dati senza utilizzare il classico PostBack o redirect  ad altra pagina. Ogni volta che in .NET creiamo un WS possiamo richiamarlo  in più modi: tramite codice .NET all’interno del CodeBehind, tramite http o tramite SOAP.
Quello che vogliamo utilizzare noi è il metodo tramite SOAP. Premetto che questa parte di codice funziona solo con IE dato che è stato utilizzato per una Web Application non multi-browser, ma è poi facilmente estendibile anche a FireFox, Mozzilla ecc…
Se si esegue nel browser il nostro ASMX vedremo che all’interno di ogni metodo sono presenti gli esempi di chiamata.
Di seguito quello che vogliamo utilizzare noi.

<?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:Body>   
<getComuni xmlns=”http://www.sintax.org/WS”>
     
<Nazione>
int</Nazione>     
<Provincia>
string</Provincia>   
</getComuni> 
</soap:Body>
<soap:Evenlop>

 Il NameSpace del nostro WS  è www.sintax.org/WS. E’ descrittivo, non vincolante al funzionamento del WS, ma cmq opportuno metterlo con il dominio che ospita il nostro WS.
Il metodo che vogliamo chiamare è getComuni e i parametri che il WS richiede sono un intero ed una stringa.
Il nostro obiettivo è creare un oggetto parametrico che sia indipendente da quale WS venga chiamato, dal suo Namespace, dal nome del metodo e dai suoi parametri.
Dato che chiameremo il nostro WS in modo asincrono, vogliamo che quando abbia finito la sua chiamata richiami una nostra funzione esterna al WS che ne prenda il risultato e lo elabori.
       Pariamo con il codice:methodName à il nome del metodo
param
à nodi XML che contengono i parametri correttamente impostati
callBack
à funzione JS di ritorno da eseguire quando il WS ha finito
wsUrl
à l’url del WS del tipo (../WS/miows.asmx)
nameSpace
à il namespace del WS.
questi ultimi parametri in questo esempio sono “inchiavaradati” nel codice, ma niente vieta di metterli in variabili Globali della pagina.

var xmlVall = null;  
//DEVE ESSERE GLOBALE

function miniSoap(methodName, param, callBack, wsUrl, nameSpace){ 
      //qui controlliamo che il browser riesca ad instanziare l’oggeto XMLHTTP   
     if (window.XMLHttpRequest)
    
{
        
xmlVal=new XMLHttpRequest()      
     }
 
    
else if (window.ActiveXObject)
    
{
      
xmlVal=new ActiveXObject(“Microsoft.XMLHTTP”)
    
} 

 

     if (xmlVal!=null)
    
{          
     //apriamo il nostro oggetto dicendogli che passiamo in POST, gli diamo l’url e gli dicamo che deve essere asincrono   
          
      
xmlVal.open (“POST”, wsUrl, true);          
      
xmlVal.setRequestHeader( “Content-Type”,“text/xml; charset=utf-8″);
       //costruiamo la nostra SOAPAction
       xmlVal.setRequestHeader(“SOAPAction”, nameSpace + “/” + methodName);
          
      
var strRequest = “<?xml version=’1.0′ encoding=’utf-8′?>”;
          
      
strRequest += “<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/’>”;
              strRequest += “<soap:Body>”;
           //metodo e namespace 
          
      
strRequest += “<”+ methodName +” xmlns=\”"+ nameSpace +“/\”>”;             
       //I parametri
       strRequest +=  param;      
       //chiusura del nodo del metodo
       strRequest += “</”+ methodName +“>”;
          
      
strRequest += “</soap:Body>”;          
      
strRequest += “</soap:Envelope>”;        

       //l’evento onreadystatechange è fondamentale per dirgli cosa fare al momento che
       la chiamata  restituisce un risultato
       xmlVal.onreadystatechange= eval(callBack);
       //il callBack è la nostra funziona(es:pippo())
          
      
xmlVal.send(strRequest);        
      
}
       else
       
{
         
alert(“il tuo browser non supporta XMLHttp”)        
       
}
} 

Vediamo adesso un esempio di chiamata al nostro miniSoap.
function  execWS(){
  var
strRequest = “<Nazione>1</ Nazione >”;          
  strRequest += “<Provincia>ROMA</Provincia>”;
  miniSoap(“getComuni”, strRequest, “callBackComuni”, “../WS/qualiproxy.asmx”, “http://sintax.org/WS”);  
}  
Qui di seguito la funzione callBack che viene eseguita al momento in cui il WS termina la sua esecuzione. Controlliamo che lo stato di ritorno sia 4 (esito corretto) e poi possiamo tranquillamente utilizzare l’xml di ritorno a piaciemento 

function  callBackComuni()
{
  
if (xmlVal.readyState==4)
  
{
     
var xmlDoc = new ActiveXObject(“Msxml2.DOMDocument”);
   
  xmlDoc.async = false; 
     
xmlDoc.resolveExternals = false;
 
     
xmlDoc.loadXML(xmlVal.responseXML.xml);
     
alert(xmlVal.responseXML.xml);
   
}
}—————-

 

 

 

File in versione DOC integrazione JS + WS


Lascia un commento

La tua risposta:

Categorie