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

GridView con imagenes en miniatura

GridView con imagenes en miniatura

Entre las muchas aplicaciones que hay en la playstore de google están las galerías de fotos de chicas 🙂 que tantos nos e...

Como crear un Grid en Pygame

Como crear un Grid en Pygame

Utilizando pygame para hacer gráficos en python, se muestra a continuación un sencillo ejemplo de cómo utilizar esta lib...

4 IDEs online para java y mucho más

4 IDEs online para java y mucho más

A continuación te muestro 4 herramientas online para programadores en lenguaje Java y otros lenguajes de programación co...

Hangman: El juego del ahorcado en java

Hangman: El juego del ahorcado en java

El Juego del ahorcado o Hangman, es un clásico juego de mesa que consiste en adivinar la palabra secreta, si no lo consi...

ANSI: Colorear consola de salida de Netbeans

ANSI: Colorear consola de salida de Netbeans

Cuando realizamos proyectos java desde Netbeans, usamos System.out.println para imprimir datos en consola (para depurar,...

Personalizar JTable: Problema resuelto

Personalizar JTable: Problema resuelto

En este post se da respuesta a una pregunta realizada por facebook. El problema dice así: Se quiere personalizar un JTab...

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?

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp