Servicios Web usando SOAP II

Hola CubaCoders:

Como indica el título hoy seguiremos con la segunda parte del tuto de la semana pasada que será la aplicación cliente en Android para poder leer el servicio creado usando SOAP, lo primero será abrir el servidor que creamos en el tutorial anterior y ponerlo a correr y una vez que este corriendo escribiremos lo siguiente en el navegador: http://localhost:8080/ServicioWeb/Login?wsdl y nos va a salir el código wsdl del servidor que no es más que un vocabulario XML para describir el servicio web, pero no nos vamos a detener aquí ya que no es objetivo que conozcan mucho acerca de wsdl, de este código solo debemos tener en cuenta esta etiqueta:

<xsd:schema>

<xsd:import namespace=http://login.cubacoders.cu/ schemaLocation=”http://localhost:8080/ServicioWeb/Login?xsd=1″/>

</xsd:schema>

Y aquí nos vamos a detener para crear nuestra aplicación Android a la cual llamaremos LoginClient y luego de creado el proyecto crearemos dentro de este una clase llamada Login que extenderá será la encargada de realizar la conexión al servicio web y aquí es donde vamos a ver para que nos servía la etiqueta que hemos sacado del código wsdl, vamos a crear 4 variables de tipo string

String namespace= “http://login.cubacoders.cu/”;

String url = “http://192.168.116.1:8080/ServicioWeb/Login?wsdl”;

String soap_action=”http://service.cubacoders.cu/”;

String method =”Login”;

Como podemos ver el namespace no es más que el nombre del paquete java donde creamos los servicios y el url es la dirección del código wsdl del servicio, el soap_action es igual al namespace y el method es el nombre que tiene el método que creamos en el servicio para controlar el login, ahora continuamos creando un método llamado Log que será bastante parecido al que creamos en el servicio web y que tiene la intención de acceder a ese servicio web y serializar los datos que vamos a escribir en la aplicación Android para que SOAP pueda interpretarlos, pero Android aún no cuenta con clases propias capaces de manejar SOAP por eso vamos a utilizar una librería llamada ksoap que nos va a facilitar las cosas, aquí debajo les dejo el código de esta clase que creamos y luego les comento las partes principales del mismo

public boolean Log(String user,String pass)

   {

       boolean res = false;

       SoapObject soapObject = new SoapObject(namespace,method);

       soapObject.addProperty(“user”,user);

       soapObject.addProperty(“pass”,pass);

       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

       envelope.setOutputSoapObject(soapObject);

       HttpTransportSE transportSE = new HttpTransportSE(url);

       try {

           transportSE.call(soap_action,envelope);

           SoapPrimitive resultado_xml =(SoapPrimitive)envelope.getResponse();

           res = Boolean.parseBoolean(resultado_xml.toString());

       } catch (SocketTimeoutException e) {

           e.printStackTrace();

       } catch (XmlPullParserException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

       return res;

   }

 

Creamos un objeto de tipo SoapObject y les pasamos por parámetros el namespace y el nombre del método al que queremos hacer referencia, luego les agregamos como propiedades los valores que el método creado en el servicio web recibe por parámetros (user y pass), luego creamos un objeto de tipo SoapSerializationEnvelope para serializar el SoapObject, creamos un objeto HttpTransportSE para comunicar la aplicación cliente con el servidor y por ultimo creamos un objeto de tipo SoapPrimitive para capturar la respuesta del servidor que en este caso será true o false.

Pero aún falta trabajo por hacer para que funcione nuestro cliente pues si ejecutamos este código en la activity principal nos lanzara una excepción de tipo NetworkOnMainThread. Esto es debido a que en versiones recientes de Android no se permite realizar operaciones de larga duración directamente en el hilo principal de la aplicación. Por tanto, debemos crear una clase llamada LoginService que extenderá de AsyncTask y la agregaremos debajo de la activity principal pues vamos a necesitar algunos valores que capturamos en la misma y se verá como les muestro a continuación:

public class LoginService extends AsyncTask<Void,Integer,Boolean> {

       String u = user.getText().toString();

       String p = pass.getText().toString();

       @Override

       protected Boolean doInBackground(Void… params) {

           boolean res;

           Login login = new Login();

           res = login.Log(u,p);

           return res;

       }

       @Override

       protected void onPostExecute(Boolean res) {

           if (res) {

               txt.setText(“TRUE”);

           } else {

               txt.setText(“FALSE”);

           }

       }

   }

Aquí no hay mucho que comentar es solo una tarea asíncrona común y corriente y ya solo queda en nuestra activity principal llamar a nuestra tarea asíncrona de esta forma:

LoginService service = new LoginService();

service.execute();

por ultimo no debemos olvidar darle los permisos necesarios en el Android Manifest:

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

ya con esto debemos tener funcionando nuestro cliente sin problemas, aquí debajo les voy a dejar la librería ksoap para que la descarguen, espero que este tutorial les haya sido útil, saludos y hasta el próximo tuto.

ksoap

Share

7 thoughts on “Servicios Web usando SOAP II

  1. Brother, probe tu codigo para la parte de android y no e funciono, se me cierra la app, en este post te falta darle permiso para que salga a internet pero tampoco me funciono asi, luego revisando le hize algunas variaciones al código, y si me funciono de maravillas. te lo posteo en un rato, acabo de llegar

    1. si, me faltaron algunas cosas porke hice eso un poco apurado y se me olvido si puedes dime ademas de los permisos de internet ke mas me falto para arreglarlo

      1. aqui va, luego lo ejecuto desde el main con un boton o lo que sea y le paso un parametro tipo string , en mi caso no use tu propuesta de servidor, use nusoap, con un metodo pasandole texto nada más. creo que las diferencias es con los catch o con que no desconectas. bueno aqui va mi aporte. Saludos

        public class ClienteWS extends AsyncTask {

        private Context context;

        private static final String SOAP_ACTION = “http://192.168.10.1/services/servicio.php/HelloWorld”;
        private static final String METHOD_NAME = “HelloWorld”;
        private static final String NAMESPACE = “http://192.168.10.1/services/servicio.php”;
        private static final String URL = “http://192.168.10.1/services/servicio.php?wsdl”;

        public ClienteWS(Context context) {
        this.context = context;
        }

        @Override
        protected void onPostExecute(String s) {
        Toast.makeText(context, s, Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(String… params) {

        String result = null;

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER10);

        // Con esta opción indicamos que el web service no es .net
        envelope.dotNet = false;

        envelope.setOutputSoapObject(request);

        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ACTION);

        // Enviando un parámetro al web service
        request.addProperty(“nombre”, params[0]);

        try {

        // Enviando la petición al web service
        httpTransport.call(SOAP_ACTION, envelope);

        // Recibiendo una respuesta del web service
        SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();

        result = resultsRequestSOAP.toString();

        httpTransport.getConnection().disconnect();
        }
        catch (IOException | XmlPullParserException e) {
        Log.v(“Error”, e.getMessage());
        result = e.getMessage();
        }

        return result;

        }
        }

        1. muy buena tu solucion, no se porke te daba error la ke publike porke a mi me funciona bien, los catch fueron los ke me genero el android studio y la parte de desconectar nunka le he usado y no me ha dado problemas de todas formas es un aporte para el ke no le funcione mi solucion use la tuya muchas gracias por comentar

          1. Me gustaria colaborar con el sitio, aprobechar esta linea de los webservices pero ahora con la libreria volley. que tal?

          2. el sitio esta abierto a colaboraciones de todo el que este interesado y quiera compartir sus conocimientos con la comunidad de programadores, mandame tus datos por correo a hchaviano@otevc.co.cu desde un correo nacional y te creo un usuario para que puedas subir tus post

Deja un comentario

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