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.
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.