Tuesday, December 20, 2011

Interrogare un Web Service ASP.NET con Android

Abbiamo il nostro bel WS in ASMX o WCF e vogliamo renderlo raggiungibile dai nostri terminali Android senza troppe rogne? Le librerie ksoap2 ci stravengo incontro!

Scarichiamo il jar relativo qui , importiamolo nel nostro progetto e aggiungiamo le referenze nella nostra classe:

 import org.ksoap2.SoapEnvelope;  
 import org.ksoap2.serialization.SoapObject;  
 import org.ksoap2.serialization.SoapPrimitive;  
 import org.ksoap2.serialization.SoapSerializationEnvelope;  
 import org.ksoap2.transport.HttpTransportSE;  

Supponendo di avere un webservice con una pagina "Service1.asmx" la quale contiene questo metodo:

 [WebMethod]  
 public string HelloWorld(string valore)  
 {  
       return valore;  
 }  
Lato Android io effettuo la chiamata al metodo HelloWorld così:

//Definisco le costanti utili alla configurazione degli oggetti ksoap2.   
private static final String NAMESPACE = "http://tempuri.org/";    
private static final String METHOD_NAME = "HelloWorld";   
//Se si vuole fare dei WS fatti in casa è possibile utilizzare dei servizi di redirect   
//gratuiti come No-IP. "aliascelto.zapto.org" rimanderà grazie al client No-IP al mio Ip pubblico.   
//Se abbiamo un router, bisognerà ricordarsi di aprire le porte da noi utilizzate    
//(vedi anche firewall di Windows). --> http://www.no-ip.com  
private static final String URL = "http://aliasscelto.zapto.org/Service1.asmx";    
final String SOAP_ACTION = "http://tempuri.org/HelloWorld";   


//Richiesta   
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);   
request.addProperty("valore", s); //valore non è altro che il nostro parametro d'ingresso   
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);   
envelope.dotNet = true;  //opzionale   
envelope.setOutputSoapObject(request);   
 
//Chiamata   
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);   
androidHttpTransport.call(SOAP_ACTION, envelope); 
  
//Risposta   
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();   
String r= result.toString();   

Lo stesso identico codice è possibile riutilizzarlo per WS in WCF, cambierebbe solo la costante URL.

Ovviamente questo è un metodo e una soluzione, a voi la scelta :)



No comments:

Post a Comment