EEEsteban Etayo

WebServices Arquitectura SOA

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

Captura de pantalla 2011-10-31 a la(s) 13.41.24 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.

Comentarios

Virginia · 21 de noviembre de 2011

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

Virginia · 21 de noviembre de 2011

Olvídalo, ya resolví :P

ELo · 27 de agosto de 2012

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"

Claudio Brignardello · 6 de septiembre de 2013

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.