Conectar Android A Un Webservice en
Conectar Android A Un Webservice en
Conectar Android A Un Webservice en
el usuario la escriba escoger una categora en la cual estar alojada, con su fecha de edicin, su autor, y su fecha de publicacin. Esta dinmica esta en cargada el web service. El web service esta configurado con un gestor base de datos en sql server, adems tendr una interfaz de opraciones. El celular se conectara la web service, y tomara de una tabla del service la informacin que necesite, recordemos que los mviles jamas tendr bases de datos relaciones, la base de datos que tiene los mviles son base de datos planas.
En primer lugar crearemos la peticin (request) a nuestro mtodo NuevoCliente. Para ello crearemos un nuevo objeto SoapObject pasndole el namespace y el nombre del mtodo web. A esta peticin tendremos que asociar los parmetros de entrada mediante el mtodo addProperty() al que pasaremos los nombres y valores de los parmetros (que en nuestro caso se obtendrn de los cuadros de texto de la vista principal).
El segundo paso ser crear el contenedor SOAP (envelope) y asociarle nuestra peticin. Para ello crearemos un nuevo objeto SoapSerializationEnvelope indicando la versin de SOAP que vamos a usar (versin 1.1 en nuestro caso, como puede verse en la imagen anterior). Indicaremos adems que se trata de un servicio web .NET activando su propiedad dotNet. Por ltimo, asociaremos la peticin antes creada a nuestro contenedor llamando al mtodo setOutputSoapObject(). 1SoapSerializationEnvelope envelope = 2 new SoapSerializationEnvelope(SoapEnvelope.VER11); 3 4envelope.dotNet = true; 5 6envelope.setOutputSoapObject(request); Como tercer paso crearemos el objeto que se encargar de realizar la comunicacin HTTP con el servidor, de tipo HttpTransportSE, al que pasaremos la URL de conexin a nuestro servicio web. Por ltimo, completaremos el proceso realizando la llamada al servicio web mediante el mtodo call(). 1 2 HttpTransportSE transporte = new HttpTransportSE(URL); 3 4 try { 5 transporte.call(SOAP_ACTION, envelope); 6 7 //Se procesa el resultado devuelto //... 8 } 9 (Exception e) 10catch { 11 txtResultado.setText("Error!"); 12} 13 Tras la llamada al servicio ya estamos en disposicin de obtener el resultado devuelto por el mtodo web llamado. Esto lo conseguimos mediante el mtodo getResponse(). Dependiendo del tipo de resultado que esperemos recibir deberemos convertir esta respuesta a un tipo u otro. En este caso, como el resultado que esperamos es un valor simple (un nmero entero) convertiremos la respuesta a un objeto SoapPrimitive, que directamente podremos convertir a una cadena de caracteres llamado a toString(). Ms adelante veremos cmo tratar valores de retorno ms complejos.
1SoapPrimitive resultado_xml =(SoapPrimitive)envelope.getResponse(); 2String res = resultado_xml.toString(); 3 4if(res.equals("1")) txtResultado.setText("Insertado OK"); 5 Y listo, con esto ya tenemos preparada la llamada a nuestro servicio web y el tratamiento de la respuesta recibida. Un detalle ms antes de poder probar todo el sistema. Debemos acordarnos de conceder permiso de acceso a internet a nuestra aplicacin, aadiendo la linea correspondiente al Android Manifest: 1<uses-permission android:name="android.permission.INTERNET"/> Pues bien, para probar lo que llevamos hasta ahora podemos ejecutar ambos proyectos simultneamente, en primer lugar el de Visual Studio para iniciar la ejecucin del servidor local que alberga nuestro servicio web (hay que dejar abierto el explorador una vez que se abra), y posteriormente el de Eclipse para iniciar nuestra aplicacin Android en el Emulador. Una vez estn los dos proyectos en ejecucin, podemos rellenar los datos de nuestro cliente en la aplicacin Android y pulsar el botn Enviar para realizar la llamada al servicio web e insertar el cliente en la base de datos (que por supuesto tambin deber estar iniciada). Si todo va bien y no se produce ningn error, deberamos poder consultar la tabla de Clientes a travs del SQL Server Management Studio para verificar que el cliente se ha insertado correctamente.
En la imagen vemos cmo hemos insertado un nuevo cliente llamada cliente7 con nmero de telfono 7777. Si consultamos ahora nuestra base de datos Sql Server podremos comprobar si el registro efectivamente se ha insertado correctamente.
Con esto, ya sabemos realizar una llamada a un servicio web SOAP que devuelve un valor de retorno sencillo, en este caso un simple nmero entero. Lo siguiente que vamos a ver ser como implementar la llamada a un mtodo del servicio web que nos devuelva un valor algo ms complejo. Y esto lo vamos a ver con la llamada al mtodo web ListadoClientes() que recordemos devolva un array de objetos de tipo Cliente. En este caso, la llamada al mtodo web se realizar de forma totalmente anloga a la ya comentada. Donde llegarn las diferencias ser a la hora de tratar el resultado devuelto por el servicio, comenzando por el resultado del mtodo getResponse() de ksoap. En esta ocasin, dado que el resultado esperado no es ya un valor simple sino un objeto ms complejo, convertiremos el resultado de getResponse() al tipo SoapObject, en vez de SoapPrimitive como hicimos anteriormente. Nuestro objetivo ser generar un array de objetos Cliente (lo llamaremos listaClientes) a partir del resultado devuelto por la llamada al servicio. Como sabemos que el resultado devuelto por el servicio es tambin un array, lo primero que haremos ser crear un array local con la misma longitud que el devuelto, lo que conseguiremos mediante el mtodo getPropertyCount(). Tras esto, iteraremos por los distintos elementos del array devuelto mediante el mtodo getProperty(ind), donde ind ser el ndice de cada ocurrencia. Cada uno de estos elementos ser a su vez otro objeto de tipo SoapObject, que representar a un Cliente. Adicionalmente, para cada elemento accederemos a sus propiedades (Id, Nombre, y Telefono) una vez ms mediante llamadas a getProperty(), con el ndice de cada atributo, que seguir el mismo orden en que se definieron. As, getProperty(0) recuperar el Id del cliente, getProperty(1) el nombre, y getProperty(2) el telfono. De esta forma podremos crear nuestros objetos Cliente locales a partir de estos datos. Al final de cada iteracin aadimos el nuevo cliente recuperado a nuestro array. Veamos como quedara todo esto en el cdigo, donde seguro que se entiende mejor: 1 2 3 4 5 6
SoapObject resSoap =(SoapObject)envelope.getResponse(); Cliente[] listaClientes = new Cliente[resSoap.getPropertyCount()]; for (int i = 0; i < listaClientes.length; i++) { SoapObject ic = (SoapObject)resSoap.getProperty(i);
7 8 9 10 11 12 13} 14 15
Cliente cli = new Cliente(); cli.id = Integer.parseInt(ic.getProperty(0).toString()); cli.nombre = ic.getProperty(1).toString(); cli.telefono = Integer.parseInt(ic.getProperty(2).toString()); listaClientes[i] = cli;
En nuestra aplicacin de ejemplo aadimos un nuevo botn y un control tipo lista (lo llamo lstClientes), de forma que al pulsar dicho botn rellenemos la lista con los nombres de todos los clientes recuperados. La forma de rellenar una lista con un array de elementos ya la vimos en los artculos dedicados a los controles de seleccin, por lo que no nos pararemos a comentarlo. El cdigo sera el siguiente (Nota: s que todo esto se podra realizar de forma ms eficiente sin necesidad de crear distintos arrays para los clientes y para el adaptador de la lista, pero lo dejo as para no complicar el tutorial con temas ya discutidos en otros artculos): 1 //Rellenamos la lista con los nombres de los clientes 2 final String[] datos = new String[listaClientes.length]; 3 4 for(int i=0; i<listaClientes.length; i++) 5 datos[i] = listaClientes[i].nombre; 6 7 ArrayAdapter<String> adaptador = new ArrayAdapter<String>(ServicioWebSoap.this, 8 android.R.layout.simple_list_item_1, datos); 9 10lstClientes.setAdapter(adaptador); 11 Por ltimo, vamos a ver cmo llamar a un mtodo web que recibe como parmetro algn objeto complejo. Para ilustrarlo haremos una llamada al segundo mtodo de insercin de clientes que implementamos en el servicio, NuevoClienteObjeto(). Recordemos que este mtodo reciba como parmetro de entrada un objeto de tipo Cliente.