SOAP .:. Cliente android

Creado por jc mouse Jueves, noviembre 24, 2016

En esta oportunidad construiremos una aplicación android que nos permitirá consumir  un servicio web utilizando la librería KSOAP2 bajo el protocolo SOAP (Simple Object Access Protocol), el servidor que esta en java, ya lo construimos en un post anterior [Servicio Web SOAP en Java] . Antes de continuar, es necesario leer ese post y poder ejecutarlo sin problemas.

Necesitamos

  • IDE Android Studio
  • IDE Netbeans 8.x
  • Libreria ksoap2-android
  • PC con WiFi
  • Servidor GlassFish
  • Celular con WiFi y con función de “Vinculación y Zona Wi-Fi Portatil
  • Proyecto Servidor SOAP [Servicio Web SOAP en Java]

Nivel: Avanzado

Tiempo 30 minutos

Paso 1. Proyecto en Android Studio

File → New → New Project

A continuación escribimos como nombre de aplicación: SOAPClient

android studio

En Target Android Devices:

Minimum SDK: API 16: Android 4.1

A continuación seleccionamos una plantilla en blanco “Empty Activity”, dejamos los valores del MainActivity como están y presionamos [finish] para crear el proyecto.

soap android ejemplo

Paso 2. Libreria ksoap2-android

El proyecto ksoap2-android proporciona una biblioteca para trabajar con SOAP de lado del cliente para la plataforma Android.  Está licenciado bajo MIT y por tanto puede ser incluido en su aplicación comercial pero se recomienda leer más información al respecto en la pagina del proyecto.

Descarga el JAR de la ultima versión desde: http://simpligility.github.io/ksoap2-android/getting-started

En este post se utiliza la versión 3.6.1 de la librería: ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar

Agregar la librería al proyecto:

Una vez descargado el JAR, pega la libreria en la carpeta /app/libs del proyecto android

Abre el archivo build.gradle (Module:app) y agrega la siguiente linea

compile files(‘libs/ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar’)

en el apartado de dependencias “dependencies“. Una vez hecho esto, en la parte superior aparece una barra amarilla con un link “Sync now“, presionalo y espera unos segundos.

Si no tenemos errores, podemos continuar.

Paso 3. Permisos

Abre el archivo AndroidManifest.xml y agrega el siguiente permiso:

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

Paso 4. Interfaz de Usuario

Abre el archivo activity_main.xml y reemplaza el código por:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="net.jc_mouse.soapclient.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Introduce numero:"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/editText"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Convertir"
        android:id="@+id/button"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText2"/>
    
</LinearLayout>

Paso 5. WSDL

WSDL (Web Services Description Language) es un formato del Extensible Markup Language (XML) que se utiliza para describir servicios web (WS) es decir, los requisitos del protocolo y los formatos de los mensajes necesarios para interactuar con los servicios listados en su catálogo. Las operaciones y mensajes que soporta se describen en abstracto y se ligan después al protocolo concreto de red y al formato del mensaje. [Santa Wikipedia]

Abre y ejecuta el proyecto Servidor SOAP [Servicio Web SOAP en Java] creado en un anterior post, en este se podrá ver un enlace “WSDL File“, abrelo y copia la URL: http://localhost:8080/WSConversion/WSConversion?WSDL lo usaremos más adelante.

Si ejecutamos la operación “decToBin” para un valor “n”, podremos observar como el tester, ademas de entregarnos el resultado de dicha operación, nos ofrece un ejemplo de solicitud SOAP en XML

 1 <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 2     <SOAP-ENV:Header/>
 3     <S:Body>
 4         <ns2:DecToBin xmlns:ns2="http://soap.demo.org/">
 5             <numero>4</numero>
 6         </ns2:DecToBin>
 7     </S:Body>
 8 </S:Envelope>

De este ejemplo y del WSDL, podremos extraer las etiquetas y valores que utilizaremos en el proyecto

namespace: O espacio de nombres, es un grupo de elementos en el cual todos los nombres son únicos. Por convención los namespaces se declaran en forma de url, sin embargo no quiere decir que tiene que ser un url válido, en realidad estos url no existen y podrían ser una simple palabra. En nuestro ejemplo el namespace es “http://soap.demo.org/” formado por los paquetes en los que creamos el servidor SOAP en Netbeans.

webservice

<operation name=”DecToBin”> El nombre del método de conversión “DecToBin

<numero> el nombre del parámetro de entrada

Paso 6. Código cliente

Abre el archivo MainActivity, lo primero que haremos sera definir los controles de la interfaz y el evento clic para el único botón de la GUI.

 1 package net.jc_mouse.soapclient;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.Button;
 7 import android.widget.EditText;
 8 
 9 public class MainActivity extends AppCompatActivity {
10 
11     //controles interfaz
12     private EditText editText;
13     private EditText editText2;
14     private Button button;
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20 
21         editText = (EditText) findViewById(R.id.editText);
22         editText2 = (EditText) findViewById(R.id.editText2);
23         button = (Button) findViewById(R.id.button);
24 
25         button.setOnClickListener(
26                 new View.OnClickListener() {
27                     public void onClick(View view) {
28                         //Codigo a ejecutar 
29                     }
30                 });
31 
32     }//onCreate:end
33 
34 }//end:MainActivity

A continuación, definimos 5 constantes de las cuales hablamos en el paso 5

    private final String NAME_SPACE = "http://soap.demo.org/";
    private final String URL = "http://192.x.x.x:8080/WSConversion/WSConversion?WSDL";
    private final String DEC_TO_BIN_METHOD_NAME = "DecToBin";
    private final String DEC_TO_BIN_PARAM = "numero";
    private final String SOAP_ACTION = NAME_SPACE + DEC_TO_BIN_METHOD_NAME;

En la constante URL estamos indicando la dirección del archivo WSDL, con la IP privada de nuestra PC y el puerto 8080, en sus PC pueden ser otros valores, entonces se deben colocar esos valores.

No podemos colocar el codigo del cliente directamente en el hilo principal de la aplicación, debemos usar un hilo secundario, y por ello crearemos una clase que se extenderá de la clase AsyncTask el cual se llamara ConvertDecToBinTask, esta clase privada la colocaremos antes del “}//end:MainActivity”

    private class ConvertDecToBinTask extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... values) {
            return null;
        }

        @Override
        protected void onPostExecute(String result){
            
        }
    }

A continuación el código completo de la clase MainActivity.java con sus respectivos comentarios de linea

package net.jc_mouse.soapclient;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
//import de ksoap2
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class MainActivity extends AppCompatActivity {

    //controles interfaz
    private EditText editText;
    private EditText editText2;
    private Button button;

    //Constantes
    private final String NAME_SPACE = "http://soap.demo.org/";
    private final String URL = "http://192.x.x.x:8080/WSConversion/WSConversion?WSDL";
    private final String DEC_TO_BIN_METHOD_NAME = "DecToBin";
    private final String DEC_TO_BIN_PARAM = "numero";
    private final String SOAP_ACTION = NAME_SPACE + DEC_TO_BIN_METHOD_NAME;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
        editText2 = (EditText) findViewById(R.id.editText2);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(
                new View.OnClickListener() {
                    public void onClick(View view) {
                        new ConvertDecToBinTask().execute( editText.getText().toString() );
                    }
                });

    }//onCreate:end

    private class ConvertDecToBinTask extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... values) {
            //se crea un nuevo Soap Request
            SoapObject request = new SoapObject(NAME_SPACE, DEC_TO_BIN_METHOD_NAME);
            //Se agrega propiedad
            request.addProperty(DEC_TO_BIN_PARAM, values[0] );

            //llamada al Servicio Web
            try {
                //se extiende de SoapEnvelope con funcionalidades de serializacion
                SoapSerializationEnvelope envelope =  new SoapSerializationEnvelope(SoapEnvelope.VER11);
                //asigna el objeto SoapObject al envelope
                envelope.setOutputSoapObject(request);
                //capa de transporte http basada en J2SE
                //crea nueva instancia -> URL: destino de datos SOAP POST
                HttpTransportSE ht = new HttpTransportSE(URL);
                //estable cabecera para la accion
                //SOAP_ACTION: accion a ejecutar
                //envelope: contiene informacion para realizar la llamada
                ht.call(SOAP_ACTION, envelope);

                //clase para encapsular datos primitivos representados por una cadena en serialización XML
                SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
                StringBuffer result = new StringBuffer(response.toString());
                return result.toString();
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result){
            if (result == null) {
                editText2.setText("Error: No se pudo obtener el resultado");
            }else{
                editText2.setText(result);
            }
        }
    }
}//end:MainActivity

Paso 7.  Test

Antes de ejecutar nuestro Cliente, debemos asegurarnos de que el Servidor este en ejecución, si no es así, debes iniciarlo.

Conecta la PC y el Celular en red mediante Wi-FI, para asegurarte de que exista conexión entre el Servicio Web y el dispositivo móvil, abre un navegador y escribe:

http://localhost:8080/WSConversion/WSConversion?Tester

Si puedes ver en el navegador el Servicio Web, vamos por buen camino, podemos continuar, caso contrario revisa la conexión, la IP y el puerto.

consumir soap

Con el dispositivo conectado a la PC en modo depuración (con cable USB) en Android Studio ejecuta la aplicación cliente, la primera vez tardara unos minutos, paciencia que con el emulador es mucho peor :)

cliente soap android

Enjoy!!!

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!

Sobre el autor y el sitio web

Yo soy yo :) Mouse o como algunos de ustedes me llaman 'El Cochinote', Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

ENTRADAS QUE TE PUEDEN INTERESAR

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *


*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Comparte lo que sabes

Categorias

Android Bolivia

Bandera en Alto

Ultimas entradas

Radio.Garden es un proyecto interactivo desarrollado por el Instituto Holandés para el Sonido y la Visión en cooperación...

Una cola doblemente terminada o deque es una estructura de datos lineal que permite insertar y eliminar elementos por am...

Cada día aparecen cientos sino es que miles de nuevos sitios web en el mundo, pero son muy pocos las webs verdaderamente...

En este post conoceremos una forma de representar grafos mediante una Matriz de Adyacencia y un ejemplo básico de este e...

Web amigas