Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Proyectos / SOAP .:. Cliente android

SOAP .:. Cliente android

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

Tags

Artículos similares

JCheckBox dentro JTable con Netbeans

Para colocar un JCheckBox dentro una celda de un JTable debemos sobre escribir algunas clases para que el componente pue[...]

Generar reportes con origen de datos JSON

JSON es un formato de texto ligero para el intercambio de datos ampliamente usado en los Servicios Web. En este post uti[...]

jFace – Crea retratos hablados

La policia, el FBI u otros organismos similares utilizaban a dibujantes para realizar el «retrato hablado» de algún male[...]

Actualizar JComboBox al cambiar valor de otro JComboBox

Cuando se trabaja con base de datos, estos datos son dinámicos, cambian con el tiempo y es necesario que esos cambios se[...]

Juego: Acierta los colores (Código Fuente)

Acierta los colores o Adivina los colores es un sencillo juego que consiste en que dado 6 colores «rojo», «verde», «salm[...]

Reproduce archivos MP3 desde android

Reproducir archivos de audio en nuestras aplicaciones android. Necesitamos IDE Eclipse y SDK Android instalado Un archiv[...]