Aplicaciones con Servicio Web



Documentos relacionados
CODIGO PROYECTO: AppPixelproServicioWeb Proyecto Android - Servicio Web

Ejercicio 18. Configuración de Widgets en Android. Android Con Java. Ejercicio 18. Configuración de Widgets en Android. Curso de Android con Java

Ejercicio 4. Manejo de Layouts en Android. Android Con Java. Ejercicio 4. Manejo de Layouts en Android. Curso de Android con Java

ALMACENAMIENTOS DE DATOS EN ANDROID CON SQLITE

PRACTICAS DE ANDROID 12 - Lanzar un segundo "Activity" y pasar parámetros Problema:

Android Creación de una aplicación sencilla: Forwarding - Página 1 -

Programación Android. Alejandro Alcalde. elbauldelprogramador.com

GUIA DE LABORATORIO N 8 A(Netbeans-java,Glassfish)


Programación Android. Rafael Morón Abad

GUIA DE LABORATORIO N 3

Crear una Activity en Android. Paso por paso

INTRODUCCIÓN. Instalación de Xcode

Procesamiento de documentos XML

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

Curso de PHP con MySQL Gratis

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

Índice. Herramientas de desarrollo. Historia Qué es Android? Arquitectura del sistema. Componentes Android Modelos de Negocio

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación

Con este tutorial podrás aprender a cómo empezar a crear apps en Android, empezaremos con algo muy simple para que poco a poco vayas conociendo.

Programación Orientada a Objetos con Java

Ejercicios - Persistencia en Android: ficheros y SQLite

Microsoft Dynamics. Migración de FRx 6.7 a Management Reporter for Microsoft Dynamics ERP

Parsear HTML con htmlparser para Android Guillem Pérez

Laboratorio 6. Creación de sitios Web - Dreamweaver

GUIA DE LABORATORIO #10 Nombre de la Practica: Proxy y Filtrado web en ClearOS Laboratorio de Redes Tiempo Estimado: 2 Horas y 30 Minutos

Guía de uso del Cloud Datacenter de acens

GVisualPDA Módulo de Almacén

Escudo Movistar Guía Rápida de Instalación Para Windows

IDENTIFICACIÓN DE LA ACTIVIDAD PEDAGÓGICA

Ubuntu Server HOW TO : SERVIDOR VPN. EN ESTE SE REALIZA LO SIGUIENTE: En este how to se le va a enseñar como usar vpn. Qué es una VPN?

Desarrollo de Servicios Web con JBuilder

Introducción a los sitios de SharePoint en Office 365

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

PROCESO SERVICIOS INFORMÁTICOS Y DE TELECOMUNICACIONES. Versión: 02 GUIA PARA PUBLICACIÓN DE DOCUMENTOS EN LA WEB Página 1de 6.

AGREGAR COMPONENTES ADICIONALES DE WINDOWS

Capitulo 5. Implementación del sistema MDM

Tema 2: Introducción a Android

(PHP y APACHE), y el programa de comunicación Skype, para controlar de manera

Internet Information Server

Pruebas de unidad con JUnit

Agentes con Interfaz Gráfica.

TUTORIAL ACADÉMICO. Programación II- Taller de Programación I Fa.CENA. UNNE

MANUAL PARA CONFIGURACIÓN DEL COMPUTADOR DE LOS USUARIOS PARA EL USO DEL SISDON

*si tuvieron algún problema pueden verificar la documentación oficial Vamos a crear una BD llamada droid_login como lo muestra la siguiente imagen:

Sesión No. 4. Contextualización INFORMÁTICA 1. Nombre: Procesador de Texto

3.1 Definir objetivos y contenidos de la página web

WINDOWS : TERMINAL SERVER

12 Minería de Datos Reglas de asociación.

INSTITUTO TECNOLOGICO SUPERIOR DE TEZIUTLAN CONFIGURACION Y ADMON DE REDES

Inducción al Laboratorio de Informática

GUIA DE LABORATORIO N 8 A(Netbeans-java,Glassfish)

Instalación del Admin CFDI

GUÍA PARA LA INSTALACIÓN Y USO DE WORDPRESS BY MASTERHACKS. Guía de instalación y uso de Wordpress Página 1

Manual de usuario. Instalación y configuración del cliente VPN OpenVPN para el acceso a los servicios del Laboratorio Virtual

Normas para realizar un Blog

MANUAL DE INSTALACIÓN PLATAFORMA PROGRESA AUTOR: ASAC COMUNICACIONES DEPARTAMENTO DE DESARROLLO NOVIEMBRE DE 2007

Desarrollo de apps para móviles Android. Entorno de desarrollo

Escritorio remoto y VPN. Cómo conectarse desde Windows 7

Ejercicio 16. Mejora de Notificaciones en Android. Android Con Java. Ejercicio 16. Mejora de Notificaciones en Android. Curso de Android con Java

MANUAL DE AYUDA. SAT Móvil (Movilidad del Servicio Técnico)

Capítulo 3 Diseño del Sistema de Administración de Información de Bajo Costo para un Negocio Franquiciable

INTRODUCCIÓN.

G R U P O S INDICE Cómo crear una cuenta en ARQA? Cómo tener un grupo en ARQA? Secciones y funcionalidades de los grupos Configuración del grupo

GUÍA DE USUARIO DEL CORREO

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN

Manual de software. Dynamic Cloud. 10/2014 MS-Dynamic_Cloud v1.2

Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

INSTALACIÓN Y CONFIGURACIÓN DE ZEROSHELL 2.0 ALVARO JOSÉ ARIAS RAMIREZ Presentado a: ING. JEAN POLO CEQUEDA

MANUAL DE USUARIO CMS- PLONE

MANUAL DE FACTURACIÓN TOUCH SCREEN

Escudo Movistar Guía Rápida de Instalación Dispositivos Symbian

INSTALACIÓ N A3ERP. Informática para empresas INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

MANUAL TARIFICADOR. Clic aquí Descargar Tarificador

Redes de Área Local: Configuración de una VPN en Windows XP

Guia rápida EPlus Cliente-Servidor

Análisis y diseño del sistema CAPÍTULO 3

Camara IP Bullet Secucore 2 Megapixeles WiFi 1080p 6828BL. contacto@secucore.com.mx

Desarrollo de Aplicaciones para Android

Prácticas con Elastix Asterisk - Lab. 3

CÓMO MANEJAR SU NUEVO SITIO WEB SOBRE DRUPAL Manual técnico y de usuario. Pontificia Universidad Javeriana Grupo PSU CDI

Desarrollo de apps para móviles Android. Conceptos básicos de las aplicaciones Android

Manual de uso. Manual de uso - citanet 1

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

El protocolo IMAP ofrece la descarga de correos en modo sólo lectura, es decir descarga sólo una copia del correo y no permite el borrado.

Manual del Profesor Campus Virtual UNIVO

Procedimiento para realizar la configuración de Internet Explorer y usar el Sistema de reservaciones Go! Res versión 4.x

Mi Primer Proyecto en Android Studio

Ayuda para la instalación Componente Firma Digital INDICE. 1 Configuración previa Configuración Internet Explorer para ActiveX...

PRÁCTICA 10. Configuración de Correo y Publicar en la Web

Capitulo III. Diseño del Sistema.

StarWind

PLANTILLAS EN MICROSOFT WORD

Instituto Tecnológico de Las América. Materia Sistemas operativos III. Temas. Facilitador José Doñe. Sustentante Robín Bienvenido Disla Ramirez

SUBIR LAS ACTIVIDADES DE HOTPOTATOES A UN SITIO WEB

GUIA RAPIDA PARA GESTIONAR Y OPERAR EL GESTOR HISTORIAS CLNICAS ELECTRÓNICAS

Transcripción:

UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS PROGRAMACION PARA DISPOSITIVOS MOVILES PDM115 Ciclo I-2014 GUIA DE LABORATORIO N 11(preliminar) CONSUMO DE SERVICIO WEB DESDE APLICACIONES MOVILES Objetivo: Que el estudiante conozca las funciones básicas para consumir un servicio web de forma síncrona desde una aplicación móvil en 2 plataformas estudiadas en la asignatura, manejar los errores que pueda producirse en la conexión, y que además conozca las funciones básicas para realizar la lectura y análisis de un archivo XML. Descripción: En esta sesión de laboratorio se creara una función en la cual se establecerá una conexión con un servicio web local de forma síncrona, el dato recibido será un archivo XML, con el cual utilizaremos un parser para obtener el dato correspondiente.

Tabla de contenido Aplicaciones con Servicio Web... 1 Desarrollo en Android... 3 Modificar el recurso String.xml... 6 Modificación de la Interfaz gráfica (layout activity_main.xml)... 6 Aplicación (Archivo Java)... 7 Controlador de Datos... 10 Desarrollo en ios... 15 Interfaz Gráfica... 17 Creando conexión al Servicio Web... 19 Parser XML... 24 Parseo JSON... 25 Anexo 1 Buscar la dirección IP de nuestra pc por medio de consola... 27 Anexo 2 Buscar la dirección IP de nuestra pc de forma visual... 28 Anexo 3 Código Fuente de ViewController.m... 30

3

Aplicaciones con Servicio Web Primeramente debemos recordar que los servicio web se definen como sistemas de software diseñados para soportar una interacción maquina a máquina sobre una red, en otras palabras, podríamos decir que son como API's Web que pueden ser accedidas dentro de una red y son ejecutadas en el sistema que las aloja. Por ejemplo se podría crear un servicio web que realice operaciones matemáticas, luego desde una aplicación podríamos invocar ese servicio siempre y cuando tenga conexión a la red en la cual se encuentra, para que de esa manera nuestra aplicación pueda realizar esas operaciones matemáticas definidas en el servicio web. Esto es muy útil cuando el dispositivo que ejecutara nuestra aplicación no posee los suficientes recursos para realizar ciertos procesos, imaginemos que las operaciones matemáticas son muy complejas, entonces estos se ejecutan en un servidor y luego solo es enviada la respuesta. Los servicios web más comunes son los que se refiere a clientes y servidor que se comunican mediante mensajes XML que siguen el estándar SOAP. En los últimos años se ha popularizado un estilo de arquitectura Software conocido como REST. REST (Representational State Transfer) es un estilo de arquitectura de software para sistemas hipermedias (conjunto de métodos para escribir, diseñar y componer contenidos de multimedia) distribuidos tales como la Web. Este se refiere estrictamente a una colección de principios para el diseño de arquitecturas en red. Estos principios resumen como los recursos son definidos y diseccionados. Ahora cabe aclarar que REST no es un estándar sino solamente un estilo de arquitectura, pero a pesar que no es un estándar se base en estándares tales como HTTP, URL, Representación de Recursos (XML, HTML, GIF,etc.) y tipo MIME (text/xml, text/html, etc.). Con REST tenemos la posibilidad de recibir dos tipos de respuesta, en XML y JSON. La forma como funciona es similar a un cliente/servidor web normal a diferencia que hoy nuestra aplicación procesara los datos, una característica de la arquitectura REST es que la petición se expone en la URL en forma de directorios y recursos. Como se mencionó antes la respuesta puede ser en XML o JSON, por tal motivo la aplicación debe contener un parser (analizador sintáctico) para poder obtener la información contenida en estas respuestas enviadas desde el web service. Un parser puede ser un objeto que toma el archivo y lo analiza para obtener la información requerida. 1

Para la realización de los siguientes proyectos el servicio estaba alojado en la dirección http://172.16.14.227:8080 /WelcomeRESTXML/webresources/welcome y la respuesta en todos los casos es: <respuesta> <numero>uno</numero> </respuesta> 2

Desarrollo en Android Ejecutamos Eclipse Creamos un nuevo Proyecto de Aplicación de Android o Nombre de la Aplicación: Web Service o Nombre del proyecto: WebServiceCarnet_Android o Paquete: sv.ues.fia.carnet o Minima API requerida: 8 o API objetivo: 17 o Elegir Blank Activity o Nombre de la Actividad: MainActivity o Nombre del Layout: activity_main Presione clic en siguiente (Next) 3

Presione clic en siguiente (Next) Presione clic en siguiente (Next) 4

Clic en Siguiente (Next) Clic en Finalizar (Finish) 5

Modificar el recurso String.xml Una vez que ya tengamos listo el proyecto agregaremos un nuevo recurso de tipo string en res/values/string.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">webservice</string> <string name="action_settings">settings</string> <string name="indicaciones">ingrese un digito</string> <string name="serviciolocal">servicio Local</string> <string name="serviciolocalues">servidor UES local</string> <string name="serviciopublicoues">servidor UES publico</string> <string name="hostgratuito">hosting Gratuito</string> </resources> Modificación de la Interfaz gráfica (layout activity_main.xml) Sustituimos en su totalidad el código por el siguiente <?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="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" tools:context=".mainactivity" > <TextView android:id="@+id/textinidicaciones" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/indicaciones" /> <EditText android:id="@+id/editentrada" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputtype="number" > <requestfocus /> </EditText> <Button android:id="@+id/button4" android:layout_width="318dp" android:layout_height="wrap_content" android:onclick="obtenerdatoslocal" android:text="@string/serviciolocal" /> <Button android:id="@+id/button1" android:layout_width="318dp" android:layout_height="wrap_content" android:onclick="obtenerdatoslocalues" 6

android:text="@string/serviciolocalues" /> <Button android:id="@+id/button3" android:layout_width="318dp" android:layout_height="wrap_content" android:onclick="obtenerdatospublicaues" android:text="@string/serviciopublicoues" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:onclick="obtenerdatos" android:text="@string/hostgratuito" /> <TextView android:id="@+id/textsalidalocal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/textsalidalocalues" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/textsalidahost" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </LinearLayout> Aplicación (Archivo Java) Como se puede observar en la definición de Button el evento onclick responderá a la función obtenerdatos. Ahora modificaremos MainActivity para que realice la conexión, para esto se auxiliara de una clase Controladora que es la que realizara la conexión al servicio web y realizara el parseo de la respuesta. En la parte marcado por amarillo, se debe de sustituir, la dirección ip asignada por la dirección ip de la computadora en la que se está trabajando, es decir, en la cual se ha realizado el webservice. package sv.ues.fia.webservicecarnet_android; import org.json.jsonobject; import org.w3c.dom.document; import org.w3c.dom.node; import android.os.bundle; import android.os.strictmode; import android.util.log; import android.view.view; import android.widget.edittext; import android.widget.textview; import android.annotation.suppresslint; import android.app.activity; 7

@SuppressLint("NewApi") public class MainActivity extends Activity { TextView indicaciones; EditText entrada; TextView salidalocal; TextView salidalocalues; TextView salidahost; private static String urlpublicaues = "http://168.243.8.13:8080/carnetwebapplication/webresources/generic/"; private static String urllocalues = "http://172.16.14.14:8080/carnetwebapplication/webresources/generic/"; private static String urlhosting = "http://carnetpdm115.site40.net/numeroenletras.php?numero="; //En el url siguiente, se debe de colocar la direccion ip correspondiente a la maquina adonde esta alojado el servicio web. //ver anexo 1 de guia11 para extrar via consola // o anexo 2 de forma visual private static String urllocal = "http://172.16.15.88:8080/carnetwebapplication/webresources/generic/"; @SuppressLint("NewApi") @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //Lineas de codigo solo para depuracion. StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); indicaciones = (TextView) findviewbyid(r.id.textinidicaciones); entrada = (EditText) findviewbyid(r.id.editentrada); salidalocal = (TextView) findviewbyid(r.id.textsalidalocal); salidalocalues = (TextView) findviewbyid(r.id.textsalidalocalues); salidahost = (TextView) findviewbyid(r.id.textsalidahost); public void obtenerdatospublicaues(view view) { Controlador parser = new Controlador(); String dato = entrada.gettext().tostring(); String url = urlpublicaues + dato; String xml = parser.obtenerrespuestadeurl(url,this); Document doc = parser.mapeoxml(xml); Log.v("MI XML",xml); PADRE // ESTAS LINEAS DE CODIGO ES CUANDO SOLO EXISTE UN NODO SIN Node n = doc.getfirstchild(); String respuesta = parser.getelementvalue(n); // MUESTRA LA RESPUESTA 8

salidalocal.settext("resultado de servicio Publico: "+respuesta); public void obtenerdatoslocalues(view view) { Controlador parser = new Controlador(); String dato = entrada.gettext().tostring(); String url = urllocalues + dato; String xml = parser.obtenerrespuestadeurl(url,this); Document doc = parser.mapeoxml(xml); Log.v("MI XML",xml); PADRE // ESTAS LINEAS DE CODIGO ES CUANDO SOLO EXISTE UN NODO SIN Node n = doc.getfirstchild(); String respuesta = parser.getelementvalue(n); // MUESTRA LA RESPUESTA salidalocalues.settext("resultado de servicio local UES: "+respuesta); public void obtenerdatoslocal(view view) { PADRE Controlador parser = new Controlador(); String dato = entrada.gettext().tostring(); String url = urllocal + dato; String xml = parser.obtenerrespuestadeurl(url,this); Document doc = parser.mapeoxml(xml); Log.v("MI XML",xml); // ESTAS LINEAS DE CODIGO ES CUANDO SOLO EXISTE UN NODO SIN Node n = doc.getfirstchild(); String respuesta = parser.getelementvalue(n); // MUESTRA LA RESPUESTA salidalocal.settext("resultado de servicio local: "+respuesta); public void obtenerdatos(view view) { Controlador parser = new Controlador(); String dato = entrada.gettext().tostring(); String url = urlhosting + dato; String json = parser.obtenerrespuestadeurl(url,this); try { JSONObject obj = new JSONObject(json); salidahost.settext("resultado de servicio hosting gratuito: "+obj.getstring("numero")); catch (Exception e) { salidahost.settext(controlador.informacionerror); 9

Controlador de Datos Hoy crearemos dentro del mismo paquete la clase controlador la cual deberá estar implementada de la siguiente manera. import java.io.ioexception; import java.io.stringreader; import java.io.unsupportedencodingexception; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.parserconfigurationexception; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.client.clientprotocolexception; import org.apache.http.client.httpclient; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.defaulthttpclient; import org.apache.http.params.basichttpparams; import org.apache.http.params.httpconnectionparams; import org.apache.http.params.httpparams; import org.apache.http.util.entityutils; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.node; import org.w3c.dom.nodelist; import org.xml.sax.inputsource; import org.xml.sax.saxexception; import android.content.context; import android.util.log; import android.widget.toast; public class Controlador { public static String informacionerror = "Conexion Exitosa"; public String obtenerrespuestadeurl(string url,context ctx) { String respuesta = " "; try { HttpParams params = new BasicHttpParams(); int timeoutconnection = 3000; HttpConnectionParams.setConnectionTimeout(params, timeoutconnection); int timeoutsocket = 5000; HttpConnectionParams.setSoTimeout(params, timeoutsocket); HttpClient httpclient = new DefaultHttpClient(params); HttpGet httpget = new HttpGet(url); HttpResponse httpresponse = httpclient.execute(httpget); HttpEntity httpentity = httpresponse.getentity(); respuesta = EntityUtils.toString(httpEntity); catch (UnsupportedEncodingException e) { Toast.makeText(ctx, "Error de conexion", Toast.LENGTH_LONG).show(); e.printstacktrace(); 10

catch (ClientProtocolException e) { Toast.makeText(ctx, "Error de conexion", Toast.LENGTH_LONG).show(); e.printstacktrace(); catch (IOException e) { Toast.makeText(ctx, "Error de conexion", Toast.LENGTH_LONG).show(); e.printstacktrace(); return respuesta; public Document mapeoxml(string xml) { Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newdocumentbuilder(); InputSource is = new InputSource(); is.setcharacterstream(new StringReader(xml)); doc = db.parse(is); catch (ParserConfigurationException e) { Log.e("Error: ", e.getmessage()); return null; catch (SAXException e) { Log.e("Error: ", e.getmessage()); return null; catch (IOException e) { Log.e("Error: ", e.getmessage()); return null; return doc; public String getvalue(element item, String str) { NodeList n = item.getelementsbytagname(str); return this.getelementvalue(n.item(0)); public final String getelementvalue( Node elem ) { Node child; if( elem!= null){ if (elem.haschildnodes()){ for( child = elem.getfirstchild(); child!= null; child = child.getnextsibling() ){ if( child.getnodetype() == Node.TEXT_NODE ){ return child.getnodevalue(); return ""; 11

Como puede observarse en MainActivity se forma la cadena URL y se le manda a obtenerxmldeurl para obtener el resultado del servicio web. En Controlador obtenerxmldeurl realiza la conexión al servicio web especificando el tiempo que debe de estar intentado realizar la conexión, de no producirse la conexión devuelve null. Luego cuando ya se tiene el resultado en la variable xml se verifica que no sea null, es decir que obtuvimos la respuesta correcta del servicio, después se realiza el mapeo a un tipo Document, para que luego solo especifiquemos la etiqueta que deseemos, en nuestro la etiqueta numero. Las siguientes dos funciones getvalue y getelementvalue son utilizados para realizar el recorrido por todas las etiquetas. En este ejemplo se especificó la etiqueta padre respuesta y luego se busca la etiqueta hijo numero con el fin de mostrar cómo se realizaría si la etiqueta padre tuviera más de un hijo. La etiqueta padre es respuesta y la etiqueta hijo es número. Ahora antes de ejecutar la aplicación debemos de establecer los permisos de conexión a internet en el manisfest.xml. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sv.ues.fia.webservicecarnet_android" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="18" /> <uses-permission android:name="android.permission.internet" />" <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="sv.ues.fia.webservicecarnet_android.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest> Nota: Debes asegurarte que en la creación del proyecto indicaste como mínimo versión la API 8 y en la versión objetivo el API 18(o API 17). De no ser así modifica dentro del manisfest el apartado de <uses-sdk android:minsdkversion="8" android:targetsdkversion="18" /> Además de cambiar el nombre paquete según tu carnet 12

Probamos el webservice, abrimos el navegador y escribimos la dirección siguiente: http://172.16.15.88:8080/carnetwebapplication/webresources/generic/2 Nota: El servicio CarnetWebApplication del servidor está corriendo y el servicio del 000Webhost, puede probarlo con el de la cátedra o con el suyo. Ejecutamos el servicio, creamos un nuevo dispositivo virtual, con las siguientes características. 13

Y luego ejecutamos. Puede ver el proyecto terminado en el repositorio de la asignatura 14

Desarrollo en ios Para el desarrollo de esta aplicación diseñaremos una interfaz sencilla 3 etiquetas (para indicaciones, respuesta y mostrar posible errores), 1 caja de texto y un botón que invocara la función que se conectara al servicio web. Accedemos a la virtualización de Mac Mountain Lion. Iniciamos X-Code. Creamos un nuevo proyecto como Single View Application. 15

En las opciones del nuevo proyecto especificar lo siguiente: Product Name: WebServiceCarnet_ios Organization Name: Su nombre Completo Company Name: UES Class Prefix: NO ESPECIFICAR NADA EN ESTE CAMPO Device: IPhone. Elegir la carpeta donde lo almacenaremos. Por último presionar Create. 16

Interfaz Gráfica Entramos al Main.Storyboard, y activamos el editor asistente (Assistant Editor), es la segunda opción de los tipos de editores. Aparecerá el asistente gráfico junto el archivo de cabecera del ViewController. Una vez así, agregaremos los controles necesarios, asegúrese te tener la opción de objetos. Diseñe una interfaz como la siguiente. Los objetos son: 1 Picker View, 4 Labels 1 Text Field y 1 Button. 17

Una vez definidos los controles los enlazaremos con el ViewController.h elija un control y apretando click derecho arrastre el enlace dentro de la definición del ViewController e instantáneamente se crearan las propiedad, solamente deberá asignarle un nombre. Asigne los siguientes nombres. 1. Texto de indicaciones de ingreso un Digito : indicacion 2. Caja de Texto: entrada 3. Texto de Respuesta: respuesta 4. Texto de Información: informacion 5. Boton Ok: Connection=Action, Nombre=obtenerRespuesta y Evento=Touch Up Inside Adicionalmente agregaremos una variable bandera que utilizaremos posteriormente. 18

Como puede observar solo al botón se le cambiara el tipo de acción reaccionando al evento Touch Up Inside. Creando conexión al Servicio Web Nuestra aplicación se conectara a un servicio web REST la cual le enviaremos un numero entero del 0 al 9 y nos devolverá el equivalente en letras, por ejemplo: le mandamos 1 nos devolverá uno, esta cadena de texto vendrá en un XML que luego tendremos que parsear, por el momento solo realicemos la conexión. El envío de la petición al servicio web se realizara al presionar el botón Ok, y como lo enlazamos con obtenerrespuesta, trabajaremos sobre este método, dependerá de la opción seleccionada en el pickerview, para saber qué tipo de webservice se consumirá. Una vez terminada la interfaz gráfica y su conexión a ViewController podemos regresar el editor estándar. Agregaremos las librerías de JSON para poder consumir los webservice de este tipo, el cual será el alojado en el materialpublico de la asignatura. Descomprimalos y arrastre los archivos después de descargados al proyecto. Luego clic en finish 19

Modificaremos el archivo viewcontroller.h para que importar dichas librerías y agregados todos los elementos, también agregaremos un NSString, como se muestra a continuación. Implementaremos primeramente los métodos del pickerview, modificando el viewdidload y agregando los métodos siguientes. En la dirección ip que contiene localhost, debe de colocarse la dirección con la que se desea trabajar localmente. 20

21

Ahora implementaremos la función obtenerrespuesta, en el archivo ViewController.m. Nota: Utilizando el editor asistente no es necesario declarar las propiedad en @systentize, ya que por defecto se le asigna a variables auxiliares las cuales su nombre es igual que la propiedad con un guión bajo al inicio, por ejemplo la propiedad indicación la utilizaremos con _indicacion. 22

Detalles de la función obtenerrespuesta Para nuestra conexión se utiliza un objeto NSData, el cual tiene una opción de inicializarlo con el contenido que provee una petición a una URL específica, entonces necesitamos también un objeto NSURL que puede inicializarse a partir de un objeto NSString. En el código se define primero nuestra URL en un objeto NSString (cadenaurl); luego a un objeto de tipo NSData (dataurl), lo inicializamos implícitamente con un objeto de tipo NSURL a partir del objeto cadenaurl, mandándole opciones de que realice el mapeo solo si es seguro y que almacene, si se produce algún tipo de error, en contenidoerror la descripción del error. Ya a partir de esas sentencias y si existe conexión al servicio web, dataurl ya contiene la respuesta a la petición. Para comprobarlo utilizamos el método NSLog(NSString *mensaje) para mostrar en la pantalla de depuración el resultado. 23

Parser XML Ahora ya tenemos la respuesta del servicio web, pero no queremos todo el XML solamente lo que está entre las etiquetas numero. La forma de obtener esto es mediante un parser, un objeto que realiza el análisis de todo el XML, en IOS tenemos disponible la clase NSXMLParser, que mediante la función parser realiza el recorrido al archivo. Solo que parser lo recorre y nada más, para controlar que es lo que está recorriendo necesitamos de los métodos delegados que esta clase provee. (Los métodos delegados son funciones que responder a eventos en otras funciones, mediante esto podemos crear un nuevo funcionamiento). Agregaremos las siguientes líneas de código a la función obtenerrespuesta. Inicializamos el objeto dataparser de la clase NSXMLParser con el dataurl establecemos que clase será la encargada de implementar los método delegados (en este caso es ella misma) y ejecutamos la función parser. Nota: En este caso da una advertencia debido a que la clase que debería de implementar los métodos delegados de un tipo NSXMLParser sería una que herede de NSXMLParserDelegate y que defina sus propios atributos. 24

Los método delegados que nos interesan son parser:foundcharacters en el cual verificamos el contenido entre 2 etiquetas, parser:didstartelement:namespaceuri:qualifiedname: el cual comprueba cual es la etiqueta de cierre y parser:parsererroroccurred: que verifica si ha ocurrido un error en el recorrido del archivo. Como desde los métodos delegados no podemos modificar directamente los controles de la interfaz ocuparemos una variable auxiliar (tmp) para guardar el resultado, lo declaramos como un atributo privado de ViewController en el archivo de cabecera. A continuación se muestra como debería de quedar el archivo de cabecera y las funciones de obtenerresultado y los delegados de NSXMLParser. Parseo JSON Se muestra como la bandera marca la pauta entre un JSON y un XML, se utilizan las mismas variables y también objetos de las librerías importadas anteriormente, se obtiene un diccionario de datos, en el cual se obtiene el resultado que encuentro según algún nombre clave. ViewController.h 25

Métodos de parseo. Ejecutamos la aplicación y nos muestra el resultado. Puede ver el proyecto terminado en el repositorio de la asignatura 26

Anexo 1 Buscar la dirección IP de nuestra pc por medio de consola En el botón de inicio ejecutar escribir la palabra cmd y luego enter Dentro de la consola ejecutar el comando ipconfig luego enter Buscamos la línea de dirección ipv4 dentro de Adaptador de Ethernet Conexión de área Local: 27

Anexo 2 Buscar la dirección IP de nuestra pc de forma visual En la barra de estado de Windows buscar el icono de red lan(presionar clic) Luego clic en Abrir el centro de redes y recursos compartidos Presionamos clic en la opción Cambiar la configuración del adaptador 28

Presionamos doble clic en Conexión de área local Presionamos clic en detalles y en la cuarta línea veremos la dirección de ipv4 que necesitamos 29

Anexo 3 Código Fuente de ViewController.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewdidload { [super viewdidload]; _selectorip.delegate = self; _selectorip.showsselectionindicator = YES; [self.view addsubview:_selectorip]; _ip.text = @"localhost"; // Do any additional setup after loading the view, typically from a nib. - (void)didreceivememorywarning { [super didreceivememorywarning]; // Dispose of any resources that can be recreated. - (IBAction)obtenerRespuesta:(id)sender { NSError *contenidoerror = nil; NSString *cadenaurl = [NSString stringwithformat:@"http://%@%@",_ip.text,_entrada.text]; if ([_bandera isequaltostring:@"si"]) { NSData *dataurl = [NSData datawithcontentsofurl:[nsurl URLWithString:cadenaURL]]; NSString *strresult = [[NSString alloc] initwithdata:dataurl encoding:nsutf8stringencoding]; NSError *error1; NSDictionary *dir = [[CJSONDeserializer deserializer] deserializeasdictionary:dataurl error:&error1]; NSString *res = [dir objectforkey:@"numero"]; _respuesta.text=res; else { NSURL *miurl = [NSURL URLWithString:cadenaURL]; NSData *dataurl = [NSData datawithcontentsofurl:miurl options:nsdatareadingmappedifsafe error:&contenidoerror]; if(!dataurl) { 30

NSLog(@"Ocurrio un error en la conexion"); _respuesta.text = @"Ocurrio un error de conexion"; _informacion.text = [NSString stringwithformat:@"compruebe su conexion. %@",contenidoerror.localizedfailurereason]; else { NSString *strresult = [[NSString alloc] initwithdata:dataurl encoding:nsutf8stringencoding]; NSLog(@"%@",strResult); NSXMLParser *dataparser = [[NSXMLParser alloc] initwithdata:dataurl]; [dataparser setdelegate:self]; [dataparser parse]; _respuesta.text = tmp; _informacion.text = @"Conexion y parseo con exito"; [_entrada resignfirstresponder]; //En este metodo se maneja el evento de cambio de seleccion - (void)pickerview:(uipickerview *)pickerview didselectrow: (NSInteger)row incomponent:(nsinteger)component { switch (row) { case 0: _ip.text = [@"" stringbyappendingstring:@"172.16.15.88:8080/carnetwebapplication/webresources/g eneric/"]; _bandera=@"no"; break; case 1: _ip.text = [@"" stringbyappendingstring:@"172.16.14.14:8080/carnetwebapplication/webresources/g eneric/"]; _bandera=@"no"; break; case 2: _ip.text = [@"" stringbyappendingstring:@"168.243.8.13:8080/carnetwebapplication/webresources/g eneric/"]; _bandera=@"no"; break; case 3: _ip.text = [@"" stringbyappendingstring:@"carnetpdm115.site40.net/numeroenletras.php?numero="] ; _bandera=@"si"; break; default: break; 31

// En este metodo se especifica la cantidad de filas que contendra el picker - (NSInteger)pickerView:(UIPickerView *)pickerview numberofrowsincomponent:(nsinteger)component { NSUInteger numfilas = 5; return numfilas; // En este metodo se especifica cuantos componentes tendra cada fila del picker - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerview { return 1; // Especifica el titulo para cada fila del componente especifico - (NSString *)pickerview:(uipickerview *)pickerview titleforrow:(nsinteger)row forcomponent:(nsinteger)component { NSString *titulo; switch (row) { case 0: titulo = [@"" stringbyappendingstring:@"ip Local"]; break; case 1: titulo = [@"" stringbyappendingstring:@"ip UES PRIVADA"]; break; case 2: titulo = [@"" stringbyappendingstring:@"ip UES PUBLICA"]; break; case 3: titulo = [@"" stringbyappendingstring:@"web HOSTING"]; break; default: break; return titulo; // Especifica el ancho del picker para cada elmento - (CGFloat)pickerView:(UIPickerView *)pickerview widthforcomponent:(nsinteger)component { int sectionwidth = 300; return sectionwidth; -(void) parser: (NSXMLParser *) parser didstartelement:(nsstring *)elementname namespaceuri:(nsstring *)namespaceuri qualifiedname:(nsstring *)qname attributes:(nsdictionary *)attributedict { if([elementname isequaltostring:@"string"]) //if([elementname isequaltostring:@"numero"]) tmp=[[nsmutablestring alloc] init]; -(void) parser: (NSXMLParser *) parser foundcharacters:(nsstring *)string { [tmp appendstring:string]; 32

NSLog(@"auxString %@",tmp); -(void) parser: (NSXMLParser *) parser parseerroroccurred:(nserror *)parseerror { tmp = [[NSMutableString alloc] init]; [tmp appendstring:@"ocurrio un error de Procesos"]; @end 33