Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Proyectos / SOAP .:. Cliente android

SOAP .:. Cliente android

Autor 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!!!

Tags

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

Yo soy yo :) JC Mouse, 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! :)

También Te Podría Interesar

Dimask: La mascara de la Belleza (Descargar)

Dimask: La mascara de la Belleza (Descargar)

La Belleza está en la Simetría ¿Qué es lo que nos hace considerar un rostro bello? ¿Está influenciado nuestro criterio p...

Detección de rostros con android

Detección de rostros con android

La API de Android ha ido evolucionado rápidamente y cada vez contiene más funcionalidades que hacen que desarrollar sist...

Crear y mover objetos en tiempo de ejecución

Crear y mover objetos en tiempo de ejecución

Dando respuesta a una interrogante sobre el como crear objetos en tiempo de ejecución y como manipular estos, desarrolle...

SQLite: Encriptación de datos

SQLite: Encriptación de datos

SQLite es un sistema de gestión de bases de datos relacional,  escrita en C, si se desea hacer uso de encriptación con S...

Construye la interfaz de facebook

Construye la interfaz de facebook

En este tutorial veremos un poco lo que es el diseño de interfaces en android, en lugar de colocar el ejemplo de uso de...

Animación de JProgressBar con hilos

Animación de JProgressBar con hilos

Si nuestra aplicación tiene que llevar a cabo un cierto trabajo que no sabemos cuanto durará y que a la vez consume much...

2 comentarios en “SOAP .:. Cliente android”

  1. Heráclides dice:

    Muchas Gracias por darnos parte de tus conocimientos.

    Tengo una pregunta al ingresar el dato y presionar el botón convertir

    me devuelve Error: No se pudo obtener el resultado.
    todo esta funcionando correctamente servicio web ksoap2 ext, te agradeceria darme una idea de cual es el problema.

    1. Mouse dice:

      eso es porque ocurrió alguna excepción ¿que mensaje te sale en el log?

Deja un comentario

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

*

Comparte lo que sabes

Categorias

Últimas entradas

“Material Design es una guía integral para el diseño visual, de movimientos y de interacción en distintas platafor...

Un TextView autocompletado nos facilita el ingreso de información en aplicaciones móviles ya que te muestra posibles opc...

Un Tabbed Activity te permite cambiar la vista entre  fragmentos desplazando el dedo  de izquierda a derecha o de derech...

Este 12 de Mayo de 2017 se produjo un ataque masivo mundial del ransomware WannaCry  el  que afecto a más de 200000 comp...

Android Bolivia

Bandera en Alto