38
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° 9 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.

PDM115 Guia Lab09 Consumo WSservice Final

  • Upload
    ocp1310

  • View
    236

  • Download
    4

Embed Size (px)

DESCRIPTION

guia sobre aplicacion de websevices en android

Citation preview

  • 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 9

    CONSUMO DE SERVICIO WEB DESDE APLICACIONES MOVILES

    Objetivo: Que el estudiante conozca las funciones bsicas para consumir un servicio

    web de forma sncrona desde una aplicacin mvil en 2 plataformas estudiadas en la

    asignatura, manejar los errores que pueda producirse en la conexin, y que adems

    conozca las funciones bsicas para realizar la lectura y anlisis de un archivo XML.

    Descripcin: En esta sesin de laboratorio se creara una funcin en la cual se

    establecer una conexin con un servicio web local de forma sncrona, 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 Studio .......................................................................................................................... 3

    Modificar el recurso String.xml ................................................................................................................... 4

    Modificacin de la Interfaz grfica (layout activity_main.xml) ................................................................... 4

    Aplicacin (Archivo Java) ............................................................................................................................. 7

    Controlador de Datos ................................................................................................................................ 12

    Prueba de la aplicacin ............................................................................................................................. 16

    Desarrollo en iOS ........................................................................................................................................... 18

    Interfaz Grfica .......................................................................................................................................... 20

    Creando conexin al Servicio Web ............................................................................................................ 22

    Parser XML ................................................................................................................................................ 27

    Parseo JSON .............................................................................................................................................. 28

    Anexo 1 Buscar la direccin IP de nuestra pc por medio de consola ............................................................ 30

    Anexo 2 Buscar la direccin IP de nuestra pc de forma visual ...................................................................... 31

    Anexo 3 Cdigo Fuente de ViewController.m ............................................................................................... 33

  • 1

    Aplicaciones con Servicio Web

    Primeramente debemos recordar que los servicio web se definen como sistemas de

    software diseados para soportar una interaccin maquina a mquina sobre una red, en otras

    palabras, podramos 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 podra crear un servicio web que

    realice operaciones matemticas, luego desde una aplicacin podramos invocar ese servicio

    siempre y cuando tenga conexin a la red en la cual se encuentra, para que de esa manera

    nuestra aplicacin pueda realizar esas operaciones matemticas definidas en el servicio web.

    Esto es muy til cuando el dispositivo que ejecutara nuestra aplicacin no posee los suficientes

    recursos para realizar ciertos procesos, imaginemos que las operaciones matemticas son muy

    complejas, entonces estos se ejecutan en un servidor y luego solo es enviada la respuesta.

    Los servicios web ms comunes son los que se refiere a clientes y servidor que se comunican

    mediante mensajes XML que siguen el estndar SOAP. En los ltimos aos 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 mtodos para escribir, disear y componer contenidos de multimedia)

    distribuidos tales como la Web. Este se refiere estrictamente a una coleccin de principios para

    el diseo de arquitecturas en red. Estos principios resumen como los recursos son definidos y

    diseccionados. Ahora cabe aclarar que REST no es un estndar sino solamente un estilo de

    arquitectura, pero a pesar que no es un estndar se base en estndares tales como HTTP, URL,

    Representacin 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

    aplicacin procesara los datos, una caracterstica de la arquitectura REST es que la peticin 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 aplicacin

    debe contener un parser (analizador sintctico) para poder obtener la informacin 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 informacin requerida.

  • 2

    Para la realizacin de los siguientes proyectos el servicio estaba alojado en la direccin

    http://172.16.14.227:8080 /WelcomeRESTXML/webresources/welcome y la respuesta en todos los casos

    es:

    uno

  • 3

    Desarrollo en Android Studio Ejecutamos Android Studio

    Creamos un nuevo Proyecto de Aplicacin con las siguientes caractersticas:

    o Nombre de la Aplicacin: WebServiceCarnet_Android

    SDK Mnimo: API 8

    Presionar Next 2 Veces y luego Finish

  • 4

    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

    WebServiceCarnet_Android Hello world! Settings Ingrese un digito Servicio Local Servidor UES local Servidor UES publico Hosting Gratuito

    Modificacin de la Interfaz grfica (layout activity_main.xml) Sustituimos en su totalidad el cdigo por el siguiente

  • 5

  • 6

    android:text="@string/servicioPublicoUES" />

  • 7

    Aplicacin (Archivo Java)

    Como se puede observar en la definicin de Button el evento onClick responder a la funcin

    obtenerDatos. Ahora modificaremos MainActivity para que realice la conexin, para esto se auxiliara de

    una clase Controladora que es la que realizara la conexin al servicio web y realizara el parseo de la

    respuesta. En la parte marcado por amarillo, se debe de sustituir, la direccin ip asignada por la direccin

    ip de la computadora en la que se est trabajando, es decir, en la cual se ha realizado el webservice.

    package carnet.fia.ues.sv.webservicecarnet_android;

    import android.os.Bundle;

    import org.json.JSONObject;

    import org.w3c.dom.Document;

    import org.w3c.dom.Node;

    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;

    @SuppressLint("NewApi")

    public class MainActivity extends Activity {

    TextView indicaciones;

    EditText entrada;

    TextView salidalocal;

    TextView salidalocalues;

    TextView salidapublicaues;

    TextView salidaHost;

  • 8

    private static String urlPublicaUES = "http://168.243.8.50:8080/CarnetWebApplication/webresources/generic/";

    private static String urlLocalUES = "http://192.168.106.4: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://192.168.174.1: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);

    salidapublicaues = (TextView) findViewById(R.id.textSalidaPublicaUes);

    salidaHost = (TextView) findViewById(R.id.textSalidaHost);

    }

    public void obtenerDatosPublicaUES(View view) {

  • 9

    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);

    // ESTAS LINEAS DE CODIGO ES CUANDO SOLO EXISTE UN NODO SIN PADRE

    Node n = doc.getFirstChild();

    String respuesta = parser.getElementValue(n);

    // MUESTRA LA RESPUESTA

    salidapublicaues.setText("Resultado de servicio Publico(fuera de ues): "+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);

    // ESTAS LINEAS DE CODIGO ES CUANDO SOLO EXISTE UN NODO SIN PADRE

    Node n = doc.getFirstChild();

  • 10

    String respuesta = parser.getElementValue(n);

    // MUESTRA LA RESPUESTA

    salidalocalues.setText("Resultado de servicio local UES: "+respuesta);

    }

    public void obtenerDatosLocal(View view) {

    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 PADRE

    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);

  • 11

    }

    }

    }

  • 12

    Controlador de Datos

    Hoy crearemos dentro del mismo paquete la clase controlador la cual deber estar implementada de la

    siguiente manera.

    package carnet.fia.ues.sv.webservicecarnet_android; 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();

  • 13

    e.printStackTrace(); } 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 ""; } }

  • 14

    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 conexin al servicio

    web especificando el tiempo que debe de estar intentado realizar la conexin, de no producirse la

    conexin 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, despus 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 cmo se realizara si la etiqueta padre tuviera ms de un hijo. La etiqueta padre es respuesta y

    la etiqueta hijo es nmero.

    Ahora antes de ejecutar la aplicacin debemos de establecer los permisos de conexin a internet en el

    manisfest.xml.

    "

    Nota: Debes asegurarte que en la creacin del proyecto indicaste como mnimo versin la API 8 y en la versin objetivo el API 18(o API 17). De no ser as modifica dentro del manisfest el apartado de Adems de cambiar el nombre paquete segn tu carnet

  • 15

    Probamos con anticipacin los servicios web que utilizaremos: los de conversin de nmeros a letras

    1) El Local(netbeans en pc local)

    Levante el servicio web de la gua 6(Servicios de suma y conversin de nmero a letras)

    Y ejecute la url que se muestra en la barra de direccin de su navegador

    http://localhost:8080/CarnetWebApplication/webresources/generic/2

    Nota: El servicio CarnetWebApplication del servidor est corriendo y

    el servicio del 000Webhost, puede probarlo con el de la ctedra o con el suyo.

    http://carnetpdm115.site40.net/NumeroEnLetras.php?numero=4

  • 16

    Prueba de la aplicacin Luego de comprobar que la Aplicacin android puede consumir los servicios

    El segundo y tercer botn consumen un mismo servicio pero desde la UES en la red de rea

    local(192.168.106.4) o desde una red externa a la UES(168.243.8.50)

    Para consumir el servicio web local(netbeans) tiene que considerar que el emulador considera su propia

    ip como localhost, por lo que al invocar dicho servicio se utilizara la ip de la pc que esta ejecutando, para

    ello puede averiguar el mismo con el comando ip config.

  • 17

    Y luego ejecutamos.

    Puede ver el proyecto terminado en el repositorio de la asignatura

  • 18

    Desarrollo en iOS

    Para el desarrollo de esta aplicacin disearemos una interfaz sencilla 3 etiquetas (para

    indicaciones, respuesta y mostrar posible errores), 1 caja de texto y un botn que invocara la

    funcin que se conectara al servicio web.

    Accedemos a la virtualizacin de Mac Mountain Lion.

    Iniciamos X-Code.

    Creamos un nuevo proyecto como Single View Application.

  • 19

    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.

  • 20

    Interfaz Grfica

    Entramos al Main.Storyboard, y activamos el editor asistente (Assistant Editor), es la segunda

    opcin de los tipos de editores.

    Aparecer el asistente grfico junto el archivo de cabecera del ViewController. Una vez as,

    agregaremos los controles necesarios, asegrese te tener la opcin de objetos. Disee una

    interfaz como la siguiente.

    Los objetos son: 1 Picker View, 4 Labels 1 Text Field y 1 Button.

  • 21

    Una vez definidos los controles los enlazaremos con el ViewController.h elija un control y

    apretando click derecho arrastre el enlace dentro de la definicin del ViewController e

    instantneamente 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 Informacin: informacion

    5. Boton Ok: Connection=Action, Nombre=obtenerRespuesta y Evento=Touch Up Inside

    Adicionalmente agregaremos una variable bandera que utilizaremos posteriormente.

  • 22

    Como puede observar solo al botn se le cambiara el tipo de accin reaccionando al evento

    Touch Up Inside.

    Creando conexin al Servicio Web

    Nuestra aplicacin 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 conexin. El envo de la peticin al servicio web se realizara al

    presionar el botn Ok, y como lo enlazamos con obtenerRespuesta, trabajaremos sobre este

    mtodo, depender de la opcin seleccionada en el pickerview, para saber qu tipo de

    webservice se consumir.

    Una vez terminada la interfaz grfica y su conexin a ViewController podemos regresar el editor

    estndar.

    Agregaremos las libreras 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 despus de descargados al proyecto.

    Luego clic en finish

    Modificaremos el archivo viewController.h para que importar dichas libreras y agregados todos los

    elementos, tambin agregaremos un NSString, como se muestra a continuacin.

  • 23

    Implementaremos primeramente los mtodos del pickerview, modificando el viewdidload y

    agregando los mtodos siguientes. En la direccin ip que contiene localhost, debe de colocarse la

    direccin con la que se desea trabajar localmente.

  • 24

  • 25

    Ahora implementaremos la funcin 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 guin bajo al inicio, por ejemplo la propiedad indicacin la utilizaremos con _indicacion.

  • 26

    Detalles de la funcin obtenerRespuesta

    Para nuestra conexin se utiliza un objeto NSData, el cual tiene una opcin de inicializarlo con el

    contenido que provee una peticin a una URL especfica, entonces necesitamos tambin un

    objeto NSURL que puede inicializarse a partir de un objeto NSString.

    En el cdigo se define primero nuestra URL en un objeto NSString (cadenaURL); luego a un

    objeto de tipo NSData (dataURL), lo inicializamos implcitamente con un objeto de tipo NSURL a

    partir del objeto cadenaURL, mandndole opciones de que realice el mapeo solo si es seguro y

    que almacene, si se produce algn tipo de error, en contenidoError la descripcin del error. Ya a

    partir de esas sentencias y si existe conexin al servicio web, dataURL ya contiene la respuesta a

    la peticin. Para comprobarlo utilizamos el mtodo NSLog(NSString *mensaje) para mostrar en la

    pantalla de depuracin el resultado.

  • 27

    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 anlisis de todo el XML, en IOS tenemos disponible la clase NSXMLParser,

    que mediante la funcin parser realiza el recorrido al archivo. Solo que parser lo recorre y nada

    ms, para controlar que es lo que est recorriendo necesitamos de los mtodos delegados que

    esta clase provee. (Los mtodos delegados son funciones que responder a eventos en otras

    funciones, mediante esto podemos crear un nuevo funcionamiento).

    Agregaremos las siguientes lneas de cdigo a la funcin obtenerRespuesta.

    Inicializamos el objeto dataParser de la clase NSXMLParser con el dataURL establecemos que

    clase ser la encargada de implementar los mtodo delegados (en este caso es ella misma) y

    ejecutamos la funcin parser.

    Nota: En este caso da una advertencia debido a que la clase que debera de implementar los

    mtodos delegados de un tipo NSXMLParser sera una que herede de NSXMLParserDelegate y

    que defina sus propios atributos.

  • 28

    Los mtodo 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 mtodos 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 continuacin se muestra

    como debera 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 tambin objetos de las libreras importadas anteriormente, se obtiene un diccionario

    de datos, en el cual se obtiene el resultado que encuentro segn algn nombre clave.

    ViewController.h

  • 29

    Mtodos de parseo.

    Ejecutamos la aplicacin y nos muestra el resultado.

    Puede ver el proyecto terminado en el repositorio de la asignatura

  • 30

    Anexo 1 Buscar la direccin IP de nuestra pc por medio de consola En el botn de inicio ejecutar escribir la palabra cmd y luego enter

    Dentro de la consola ejecutar el comando ipconfig luego enter

    Buscamos la lnea de direccin ipv4 dentro de Adaptador de Ethernet Conexin de rea Local:

  • 31

    Anexo 2 Buscar la direccin 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 opcin Cambiar la configuracin del adaptador

  • 32

    Presionamos doble clic en Conexin de rea local

    Presionamos clic en detalles y en la cuarta lnea veremos la direccin de ipv4 que necesitamos

  • 33

    Anexo 3 Cdigo 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) { NSLog(@"Ocurrio un error en la conexion");

  • 34

    _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/generic/"]; _bandera=@"no"; break; case 1: _ip.text = [@"" stringByAppendingString:@"172.16.14.14:8080/CarnetWebApplication/webresources/generic/"]; _bandera=@"no"; break; case 2: _ip.text = [@"" stringByAppendingString:@"168.243.8.13:8080/CarnetWebApplication/webresources/generic/"]; _bandera=@"no"; break; case 3: _ip.text = [@"" stringByAppendingString:@"carnetpdm115.site40.net/NumeroEnLetras.php?numero="]; _bandera=@"si"; break; default: break; } } // En este metodo se especifica la cantidad de filas que contendra el picker - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { NSUInteger numFilas = 5;

  • 35

    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]; NSLog(@"auxString %@",tmp); } -(void) parser: (NSXMLParser *) parser parseErrorOccurred:(NSError *)parseError { tmp = [[NSMutableString alloc] init];

  • 36

    [tmp appendString:@"Ocurrio un error de Procesos"]; } @end