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.
Hola!!! Gracias por compartir conocimientos! Bajé el zip con el código y he probado y nada, lanza error: android.os.NetworkOnMainThreadException: null
Olvídalo, ya resolví 😛
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”
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.