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
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
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.
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.
<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.
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 🙂
Enjoy!!!
Para colocar un JCheckBox dentro una celda de un JTable debemos sobre escribir algunas clases para que el componente pue[...]
JSON es un formato de texto ligero para el intercambio de datos ampliamente usado en los Servicios Web. En este post uti[...]
La policia, el FBI u otros organismos similares utilizaban a dibujantes para realizar el «retrato hablado» de algún male[...]
Cuando se trabaja con base de datos, estos datos son dinámicos, cambian con el tiempo y es necesario que esos cambios se[...]
Acierta los colores o Adivina los colores es un sencillo juego que consiste en que dado 6 colores «rojo», «verde», «salm[...]
Reproducir archivos de audio en nuestras aplicaciones android. Necesitamos IDE Eclipse y SDK Android instalado Un archiv[...]