«

»

may 07 2012

Consumiento Web Services SOAP en Android con ksoap2

SOAP es uno de lo protocolos para comunicación de datos más usados auspiciado por la W3C, existiendo multitud de servicios web implementados bajo esta tecnología. Partiendo de esta situación es importante tener unos conocimientos de partida que nos permita enfrentarnos al uso de los mismos en los proyectos que emprendamos. A continuación os guiaremos en el uso de ksoap2-android, el fork de la famosa kSOAP2 library adaptado para su uso en Android.

 

Una vez creado nuestro proyecto Android deberemos bajarnos la librería en cuestión y incluirla en nuestro build path:

download

 

Llegados este punto vayamos a la miga, como acceder y consumir el web service y para ello necesitaremos una serie de variables que usaremos en los posteriores m´rtodos:

 

// Metodo que queremos ejecutar en el servicio web
private static final String Metodo = "GetCitiesByCountry";
// Namespace definido en el servicio web
private static final String namespace = "http://www.webserviceX.NET";
// namespace + metodo
private static final String accionSoap = "http://www.webserviceX.NET/GetCitiesByCountry";
// Fichero de definicion del servcio web
private static final String url = "http://www.webservicex.net/globalweather.asmx";

 

Una vez tenemos claros estos parámetros necesarios para las peticiones pasamos al siguiente paso. El protocolo SOAP se basa en cinco pasos básicamente, definir la petición (request), configurar un sobre (envelope) (define que hay en el mensaje y como procesarlo), definir el canal de transporte, hacer la llamada y recoger los datos. Estos datos ya los procesaríamos en función del caso (XML, JSON, texto plano…).

 

A continuación os mostramos el fragmento de código en el que realizaríamos estos pasos y que incluiríamos en aquel sitio donde deseáramos realizar la petición:

 

try {

	// Modelo el request
	SoapObject request = new SoapObject(namespace, Metodo);
	request.addProperty("Param", "valor"); // Paso parametros al WS

	// Modelo el Sobre
	SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11);
	sobre.dotNet = true;
	sobre.setOutputSoapObject(request);

	// Modelo el transporte
	HttpTransportSE transporte = new HttpTransportSE(url);

	// Llamada
	transporte.call(accionSoap, sobre);

	// Resultado
	SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse();

	Log.i("Resultado", resultado.toString());

} catch (Exception e) {
	Log.e("ERROR", e.getMessage());
}

 

En próximos tutoriales os mostraremos como procesar estos datos devueltos.

 

NOTA: Para el consumo de servicios web es necesaria la conexión a Internet y por tanto deberemos solicitar dicho permiso en el manifiesto.

 

<uses-permission android:name="android.permission.INTERNET"/>

 

Vía | Ingens Blog

 

Acerca del autor

JMPergar

Mobile Developer at @BeRepublic & Founder of @AndroCode. Silver Speaker & Member of Core Team at @GDGBarcelona.

  • Anselmo

    Hola, la explicación que has publicado me ha servido. Pero tengo una duda, como le puedo hacer para jalar la información de un servicio web, en el cual no te regresa una cadena, te regresa un array de objetos, algo así:

    Array array = new Array

    Tengo que generar las clases necesarias no? Me imagino que debe de haber alguna librería para eso.

    Espero me puedas ayudar, gracias.

    • http://www.linkedin.com/in/jmpergar JMPergar

      No se si te entiendo muy bien, los servicios suelen devolver texto aunque siguiendo ciertas estructuras de datos, como JSON o XML, que representaran el conjunto de datos solicitados. Existen varias librerías que sirven para parsear estos datos y convertirlos en clases con las que trabajemos, desde la API nativa de android hasta librerias de terceros. En función del tipo de servicios a los que estes accediendo deberás trabajar de una manera u otra. En el blog tenemos publicados algunos tutoriales hacerca de estas librerías, si accedes a través de la Androteca los encontrarás facilmente.

  • Kenshin

    tengo una app en android y un ws en .net los metodos del ws que no requieren parametros funcionan perfecto pero los webmethod que requieren parametros no funcionan porque llegan nulos (null) estoy usando ksoap…. no se que podra hacer.

    • Kenshin

      perdon *ser… que podra ser.

      • http://www.linkedin.com/in/jmpergar JMPergar

        ¿A donde llegan nulos? ¿al servidor? ¿Al hacer la llamada? ¿Quieres hacer una llamada con valores nulos?

  • alex

    hola!,

    he estado probando mi app que funciona perfectamente en JSON + REST … tengo que migrar mis conexiones?

    Gracias,

    ALEX

    • alex

      juas … solo ha escrito un trozo de mi post ….

      versiones superiores a 3.0 (API 11) deja de funcionar “org.ksoap2.SoapEnvelope” … lo he probado en el emulador con API 17 (4.2) y es verdad no recibe comunicacion (excepcion … null)

      que sabes del tema? Como puede ser que el mismo codigo funcione perfectamente en versiones inferiores y luego deje de funcionar? …

      Gracias

      • http://www.linkedin.com/in/jmpergar JMPergar

        Pues no te puedo ayudar la verdad, hice las pruebas para investigar opciones y escribir el post y no he vuelto trabajar con la libreria, a ver si algun otro lector te puede echar un cable o si encuentras la respuesta la compartes ;)

        • Oscar

          En q versión está probado esta aplicación?
          Cual es la configuración del emulador?
          gracias.

  • carlos

    Hola que tal, tengo un problema al consumir un servicio en .net cuando consumo servicios que no tienen parametros todo funciona bien el detalle es cuando consumo uno que recibe parametros los parametros llegan vacios al webservice utilizo ksoap2 , te adjunto mi codigo gracias por tu tiempo
    //asi es como agrego los parametros
    request.addProperty(“a”,”2″);
    request.addProperty(“b”,”2″);

    //y este es el webservice en .net al cual los parametros llegan vacios
    _
    Public Function Sumar(ByVal a As String, ByVal b As String) As String
    Dim res As String = “”
    Try
    res = (Convert.ToDecimal(a) + Convert.ToDecimal(b)).ToString()
    Catch ex As Exception
    res = “Insertar solo numeros”
    End Try
    Return res
    End Function

    • http://www.linkedin.com/in/jmpergar JMPergar

      Así a bote pronto no sabría decirte por que es, pero por mi experiencia con webservices .net sospecho que puede ser cosa del contenttype del request. Mira a ver que contenttype espera el webservice en la peticion y si este es configurable en la libreria.

  • Aaron

    Y si lo que quiero es insertar en la base de datos…. como sería?

    • http://www.linkedin.com/in/jmpergar JMPergar

      Eso es tema de otro post, aquí se trata la conexion a servicios SOAP. Puedes echar un ojo a los que tenemos redactados, en la AndroTeca los encontraras.

  • Carlos Marcano

    Buenas,

    Estoy empezando con la programacion en android y queria consumir un servicio web que se conectara a una BD en postgreSQL.

    Me gustaria mucho que me dieras tu opinion, acerca de cual es la mejor opcion! Si usar un servicio REST o uno SOAP.

    Una de las incognitas mas grandes que tengo es como enviar datos de la aplicacion al servicio web. Me explico: Me interesa pasarle un objeto JSON al servicio web para que el contenido de este lo vacie en la BD, ¿es esto posible?

    • http://www.linkedin.com/in/jmpergar JMPergar

      No solo es posible es la tecnica más usada en apps mobiles. Los servicios REST para integración con back-ends es lo mas usado y lo que uso. De hecho te recomiendo usar RESTrung, una libreria OpenSource para gestionar llamadas a servicios REST y parsear automaticamente los JSON de respuesta: http://47deg.com/es/work/restrung/

  • Oscar

    Hola
    Tratando de consumir el servicio me da un error en esta linea:
    // Modelo el transporte
    HttpTransportSE transporte = new HttpTransportSE(url);

    alguna idea de cual podría ser mi error.
    Gracias.

    • http://www.linkedin.com/in/jmpergar JMPergar

      ¿Que error?

      • FREDY

        AYUDAA

  • beto

    hola estoy consumiendo un web service pero ocupo traerme una imagen del web service hacia mi aplicacion en endroid, ya la codifique en Base64 pero ahora mi pregunta es como decodificarla en android y mostrarla en un imageview????
    ya realice una app pero solo recibo string del web service en la cual me estoy guiando para hacerlo

    • http://www.linkedin.com/in/jmpergar JMPergar

      ¿Por que la codificas? Para tratar la descarga de imágenes te recomiendo usar “Android Query” o alguna otra librería que se encarga de este cometido. Te la descarga en segundo plano y ella solita se encarga de enchufartela en el webview que necesites cuando termine, mostrándote de mientras la típica animación de loading.

      • beto

        pero por medio del web service me traigo la imagen y su descripcion, ya qe ago una consulta que me devuelve estos 2 campos, y la imagen la tengo almacenada en sql como varbinary

  • beto

    hola quisiera saber si se puede tener un AutoCompleteTextView el cual me muestre una lista de productos, pero a su ves esta lista de productos traerla a mediante de un web service que me regresa los dies registros que coinciden con el texto que se esta escribiendo y como lo puedo hacer???
    o si hay algun tema relacionado que pueda revisar

  • Geovanny

    Hola todos
    Soy nuevo en este mundo de Java y Android, deseo saber si este fork es capaz de construir de manera transparente para el desarrollador, las clases que devuelven los métodos del Web service, de tal manera que el desarrollador solamente las instancie y consuma.
    * si esto es posible tendrían algún link donde se pueda mirar ejemplos
    * y si no se puede con este fork, cual sería la manera de hacerlo?, si tienen links para revisar

    Les agradezco por su gentil ayuda.
    Que tengan un buen día

  • Bond383

    Aquí detallan perfectamente como utilizar la libreria. http://androideity.com/2012/06/03/consultar-un-servicio-web-en-android-parte-i/

  • walter

    hey despues de obtener la respuesta del web service, como hago para convertir o tratar ese archivo como xml y despues mostrar la info q me mandan..????

  • Virginia

    Buen día!!! Pueden decirme dónde consigo un ejemplo de conexión a postgresql usando php desde android? Todos los ejemplos que consigo de SOAP (como el de listado de animales de Hassanpour) me arrojan errores y ya no sé que mas intentar. Valga aclarar que estoy comenzando con android, cualquier orientación y ayuda es buena!
    Gracias :)

  • paco

    me funciona perfecto en el emulador de eclipse, pero al correrlo en una tablet no funciona pd: si tiene internet

    • safo

      a mi también me pasaba y solo tienes que agregar este código en el oncareate() de tu mainactivity :) te deseo suerte.

      if (android.os.Build.VERSION.SDK_INT > 9) {
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
      StrictMode.setThreadPolicy(policy);
      }

      • yolanda

        Muchas gracias me ha servido de mucho

  • Gil

    hermano no as mostrado como procesar estos datos devueltos … saludos

  • http://gravatar.com/hcumbicusr hcumbicusr

    hola, muy buen tutorial. Mi pregunta es, cómo hago para recibir dos valores que regresa el metodo del WS ? uno es un list y el otro es un double.
    gracias.

  • http://gravatar.com/perzcdavid perzcdavid

    Saludos, es posible enviar y recibir un objeto a mi web service desde android ?
    si es posible como lo puedo hacer me ayudaría muchos
    gracias

  • Abigail

    Saludos!! me ha servido mucho tu tutorial.! Puedes apoyarme necesito consumir un web services ya sea del tipo de cambio o del clima en Android. Ya domino bien la libreria de la que hablas pero se me dificulta al momento de llamar los parametros puedes ayudarme! Algun otro ejemplo o video en la que pueda basarme y alguna pagina o recurso Gracias por tu aporte

  • gumersindo14

    Hola, muy buen tutorial, pero tengo una duda. Si el servicio web recibe parámetros como arrays, por ejemplo, un int[] o un String[]. como podría enviar este tipo de parámetros utilizando la libreria ksoap2.

    Gracias

  • Vanna

    I need a project android are CRUD to web service with asp.net

  • Raul Eduardo Perez

    do you have some example avaible with complex types?

  • Raul

    necesito hacer lo mismo pero con una direccion https://… con http://… funciona muy bien, pero no encuentro como hacerlo con https://… si tienes algun tip o tutorial me seria de gran ayuda

  • Carlos Montesinos

    Muy buen post, pero tengo una duda, como se puede colocar el parámetro url configurable y mediante un edittext el usuario la coloque, ya intente con una variable de instancia y una de sesión y no puedo lograrlo, se detiene la aplicación, saben como ?, tienen algún ejemplo?, gracias de antemano