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.

This entry was posted in Arquitectura SOA, WebServices. Bookmark the permalink.

4 Responses to Llamar a un servicio Web SOAP desde Android

  1. Virginia says:

    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 says:

    Olvídalo, ya resolví 😛

  3. ELo says:

    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 says:

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *