Llamar a un servicio Web SOAP desde Android

Parece una tarea facil, pero a la hora de intentarlo salen cantidad de problemas, de los cuales no es facil encontrar respuesta.A dia de hoy la mayor parte de organizaciones utilizan los servicios web REST para comunicarse, pero siempre es posible que queramos conectarnos a un servicio con protocolo SOAP, ya sea nuestro o de un tercero.
La libreria mas conocida para realizar la comunicación entre nuestra aplicación y este tipo de servicios es kSoap

Me he descargado la libreria y he creado un ejemplo para compartirlo con todos vosotros. En primer lugar he buscado un WebService abierto por la web y he dado con este: http://ws.cdyne.com/psaddress/addresslookup.asmx
Cuenta con un monton de servicios, asi que para esta este ejemplo, he recuperado el mas sencillo de todos, es decir CCServerCheck, el cual devuelve un String tras su invocacion.

Tras crear el proyecto android, los pasos que he seguido han sido:
1. Habilitar comunicaciones de Internet con el dispositivo o emulador desde el fichero AndroidManifest. Tal como

uses-permission android:name="android.permission.INTERNET"

2. Incluir la libreria kSoap en el proyecto

3. Buscar los datos necesarios para la comunicacion y crear una variable con cada uno de ellos. Tal como:

private static final String SOAP_ACTION = "http://ws.cdyne.com/CCServerCheck";
private static final String METHOD_NAME = "CCServerCheck";
private static final String NAMESPACE = "http://ws.cdyne.com/";
private static final String URL = "http://ws.cdyne.com/psaddress/addresslookup.asmx";

3. Crear el canal para la comunicación y recuperar la respuesta, en este caso un SoapPrimitive (al ser la respuesta un unico String)

try {
        String resultadoFINAL;
        //Creaccion de la Solicitud
		SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
		//Creaccion del Envelope
		SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		sobre.dotNet = true;
		sobre.setOutputSoapObject(request);
		//Creaccion del transporte
		HttpTransportSE transporte = new HttpTransportSE(URL);
		//Llamada
		transporte.call(SOAP_ACTION, sobre);
		//Resultado
		SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse();
		resultadoFINAL = resultado.toString();

        }catch (Exception e) {
        }

Os dejo el código por si teneis alguna duda.

Esta entrada fue publicada en Arquitectura SOA, WebServices. Guarda el enlace permanente.

4 respuestas a Llamar a un servicio Web SOAP desde Android

  1. Virginia dijo:

    Hola!!! Gracias por compartir conocimientos! Bajé el zip con el código y he probado y nada, lanza error: android.os.NetworkOnMainThreadException: null

  2. Virginia dijo:

    Olvídalo, ya resolví :P

  3. ELo dijo:

    Hola, he copiado tu codigo pero he cambiado las constates. me lanza el error java.lang.nullPointer exception. Dado esto me podrias sacar tu las constantes. Creo que es ahi donde me da el error. Gracias
    POST /WebService/WebService1.asmx HTTP/1.1
    Host: localhost
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: “http://tempuri.org/Conexion”

  4. Claudio Brignardello dijo:

    Me parece genial, pero como seria si tengo esta estructura en mi servicio web.
    —————–
    private static final String SOAP_ACTION = “http://ws.cdyne.com/CCServerCheck”;
    private static final String METHOD_NAME = “CCServerCheck”;
    private static final String NAMESPACE = “http://ws.cdyne.com/”;
    private static final String URL = “http://ws.cdyne.com/psaddress/addresslookup.asmx”;
    —————–

    This XML file does not appear to have any style information associated with it. The document tree is shown below.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>