Cliente SOAP para Android

David Galisteo Cantero

Veamos cómo crear un cliente en Android para una aplicación que provea servicios web SOAP.

En este caso seleccionamos como ejemplo un servicio web que, al pasarle el nombre de una ciudad y un radio, nos da las ciudades cercanas a la misma dentro de ese radio.

Según he podido comprobar, Android no tiene forma de conectar por SOAP de manera directa, así que utilizaremos una librería, llamada ksoap2-android, la cual podemos descargar en esta dirección.

Bien, una vez descargada la librería, simplemente tenemos que agregarla al proyecto, podemos hacerlo de varias maneras, moviendo el .jar a la carpeta libs de nuestro proyecto, o clickando con el botón derecho del mismo y seleccionando “Build Path” -> “Add libraries”.

Bien, una vez añadida, lo primero que haremos será dar permisos de internet a nuestra aplicación, simplemente vamos al archivo manifest.xml y definimos:

<uses-permission android:name="android.permission.INTERNET"/>

Llegados a este punto, nos metemos en faena, como se dijo anteriormente, en este ejemplo recibiremos una lista de ciudades, así que crearemos una clase “Ciudad”:

public class Ciudad {
	private String nombre;	//atributos
	private float latitud;
	private float longitud;
 
	//constructor por defecto
	public Ciudad(){
 
	}
 
	//constructor sobrecargado
	public Ciudad(String nom, float lat, float lon){
		nombre = nom;
		latitud = lat;
		longitud = lon;
	}
 
	public void setNombre(String nombre){
		this.nombre = nombre;
	}
 
	public float getLatitud() {
		return latitud;
	}
 
	public void setLatitud(float latitud) {
		this.latitud = latitud;
	}
 
	public float getLongitud() {
		return longitud;
	}
 
	public void setLongitud(float longitud) {
		this.longitud = longitud;
	}
 
	public String getNombre() {
		return nombre;
	}
 
}

Una vez hecho esto, estamos listos para consumir el servicio SOAP, para el cual usamos el siguiente código:

 
//Constantes para la invocaciónn de la llamada al servicio
//Los datos a introducir serían los referentes al servidor que queremos consumir, normalmente, los datos vienen en el fichero wsdl
private static final String NAMESPACE = "namespaceEjemplo";
private static String URL="urlEjemplo";
private static final String METHOD_NAME = "metodoEjemplo";
private static final String SOAP_ACTION ="accionEjemplo";
 
//variables necesarias para el consumo del servicio
private SoapObject request=null;
private SoapSerializationEnvelope envelope=null;
private SoapPrimitive  resultsRequestSOAP=null;
 
//Creamos un objeto SOAP
request = new SoapObject(NAMESPACE, METHOD_NAME);
 
//se crea el "envoltorio" para la petición
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.dotNet = false; //se asigna true para el caso de que el servicio sea de .NET
request.addProperty("ciudad", "Baena"); // Paso parametros al WS
request.addProperty("radio",10);
 
//Se envuelve la peticion soap
envelope.setOutputSoapObject(request);
 
//declaramos el objeto que se encargará del flujo de la información entre servidor y cliente
HttpTransportSE transporte = new HttpTransportSE(URL);
try {
        //Hacemos la llamada al servicio web
	transporte.call(SOAP_ACTION, envelope);
 
	//Se crea un objeto SoapPrimitive y se obtiene la respuesta
	//de la peticion
	Vector<SoapObject> resultsRequestSOAP = (Vector<SoapObject>) envelope.getResponse();
 
        //creo mi vector de ciudades
	Vector<Ciudad> ciudades = new Vector<Ciudad>();
 
        //inserto los objetos de respuesta en mi ciudad
	for(int i=0;i<resultsRequestSOAP.size();i++){
		ciudades.add(new Ciudad());
	}
	for (int i=0;i<resultsRequestSOAP.size();i++) {
                ciudades.elementAt(i).setNombre(resultsRequestSOAP.elementAt(i).getPropertyAsString("nombre"));
         	Log.i("SOAP",ciudades.elementAt(i).getNombre());
	}
 
 
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (XmlPullParserException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

Lo que haríamos sería mostrar por el log las ciudades que nos devuelve el servicio, quedando algo así:

cliente SOAP android

Cabe destacar que en este ejemplo sólo se ha hecho uso del atributo “nombre” de la clase ciudad, pero igual se tratarían la longitud y latitud.

Espero que os haya sido de ayuda.

HackSaludos!

Publicado el 04-12-2013

Compartelo!

Deja un comentario

Comentanos

*
Ir arriba de la pagina