pdm115 guia consumo wsservice 4 os

Upload: franklin-portillo

Post on 12-Oct-2015

20 views

Category:

Documents


0 download

DESCRIPTION

Consumo WSservice

TRANSCRIPT

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    1/36

    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 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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    2/36

    Tabla de contenido

    Aplicaciones con Servicio Web ...................................................................................................... 1

    Desarrollo en Android ................................................................................................................... 3

    Modificar el recurso String.xml ................................................................................................. 6

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

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

    Controlador de Datos .............................................................................................................. 10

    Desarrollo en iOS ......................................................................................................................... 15

    Interfaz Grfica ........................................................................................................................ 17

    Creando conexin al Servicio Web .......................................................................................... 19

    Parser XML .............................................................................................................................. 24

    Parseo JSON ............................................................................................................................ 25

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

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

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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    3/36

    3

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    4/36

    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 refiereestrictamente 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 hoynuestra 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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    5/36

    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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    6/36

    3

    Desarrollo en Android

    Ejecutamos Eclipse

    Creamos un nuevo Proyecto de Aplicacin de Android

    o Nombre de la Aplicacin: Web Service

    o

    Nombre del proyecto: WebServiceCarnet_Androido 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)

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    7/36

    4

    Presione clic en siguiente (Next)

    Presione clic en siguiente (Next)

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    8/36

    5

    Clic en Siguiente (Next)

    Clic en Finalizar (Finish)

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    9/36

    6

    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

    WebService

    SettingsIngrese un digito

    Servicio LocalServidor 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/21/2018 PDM115 Guia Consumo WSservice 4 OS

    10/36

    7

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

    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.

    packagesv.ues.fia.webservicecarnet_android;

    importorg.json.JSONObject;

    importorg.w3c.dom.Document;

    importorg.w3c.dom.Node;

    importandroid.os.Bundle;

    importandroid.os.StrictMode;

    importandroid.util.Log;importandroid.view.View;

    importandroid.widget.EditText;

    importandroid.widget.TextView;importandroid.annotation.SuppressLint;

    importandroid.app.Activity;

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    11/36

    8

    @SuppressLint("NewApi")

    publicclassMainActivity extendsActivity {

    TextView indicaciones;

    EditText entrada;

    TextView salidalocal;TextView salidalocalues;

    TextView salidaHost;

    privatestaticString urlPublicaUES=

    "http://168.243.8.13:8080/CarnetWebApplication/webresources/generic/";

    privatestaticString urlLocalUES="http://172.16.14.14:8080/CarnetWebApplication/webresources/generic/";

    privatestaticString 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 visualprivatestaticString urlLocal=

    "http://

    172.16.15.88:8080/CarnetWebApplication/webresources/generic/";

    @SuppressLint("NewApi")

    @Override

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

    }publicvoidobtenerDatosPublicaUES(View view) {

    Controlador parser = newControlador();

    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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    12/36

    9

    salidalocal.setText("Resultado de servicio Publico:"+respuesta);

    }

    publicvoidobtenerDatosLocalUES(View view) {

    Controlador parser = newControlador();

    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 SINPADRE

    Node n = doc.getFirstChild();

    String respuesta = parser.getElementValue(n);

    // MUESTRA LA RESPUESTA

    salidalocalues.setText("Resultado de servicio local UES:

    "+respuesta);}

    publicvoidobtenerDatosLocal(View view) {

    Controlador parser = newControlador();

    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 SINPADRE

    Node n = doc.getFirstChild();

    String respuesta = parser.getElementValue(n);// MUESTRA LA RESPUESTA

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

    }

    publicvoidobtenerDatos(View view) {Controlador parser = newControlador();

    String dato = entrada.getText().toString();

    String url = urlHosting+ dato;

    String json = parser.obtenerRespuestaDeURL(url,this);try{

    JSONObject obj = newJSONObject(json);

    salidaHost.setText("Resultado de servicio hosting

    gratuito: "+obj.getString("numero"));} catch(Exception e) {

    salidaHost.setText(Controlador.informacionError);}

    }

    }

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    13/36

    10

    Controlador de Datos

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

    implementada de la siguiente manera.

    importjava.io.IOException;importjava.io.StringReader;

    importjava.io.UnsupportedEncodingException;

    importjavax.xml.parsers.DocumentBuilder;

    importjavax.xml.parsers.DocumentBuilderFactory;

    importjavax.xml.parsers.ParserConfigurationException;

    importorg.apache.http.HttpEntity;

    importorg.apache.http.HttpResponse;importorg.apache.http.client.ClientProtocolException;

    importorg.apache.http.client.HttpClient;

    importorg.apache.http.client.methods.HttpGet;

    importorg.apache.http.impl.client.DefaultHttpClient;

    importorg.apache.http.params.BasicHttpParams;importorg.apache.http.params.HttpConnectionParams;

    importorg.apache.http.params.HttpParams;importorg.apache.http.util.EntityUtils;

    importorg.w3c.dom.Document;

    importorg.w3c.dom.Element;

    importorg.w3c.dom.Node;

    importorg.w3c.dom.NodeList;

    importorg.xml.sax.InputSource;

    importorg.xml.sax.SAXException;

    importandroid.content.Context;

    importandroid.util.Log;

    importandroid.widget.Toast;

    publicclassControlador {

    publicstaticString informacionError= "Conexion Exitosa";

    publicString obtenerRespuestaDeURL(String url,Context ctx) {

    String respuesta = " ";

    try{

    HttpParams params = newBasicHttpParams();

    inttimeoutConnection = 3000;

    HttpConnectionParams.setConnectionTimeout(params,timeoutConnection);

    inttimeoutSocket = 5000;

    HttpConnectionParams.setSoTimeout(params, timeoutSocket);

    HttpClient httpClient = newDefaultHttpClient(params);

    HttpGet httpGet = newHttpGet(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();

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    14/36

    11

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

    }

    returnrespuesta;

    }

    publicDocument mapeoXML(String xml) {Document doc = null;

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    try{

    DocumentBuilder db = dbf.newDocumentBuilder();InputSource is = newInputSource();

    is.setCharacterStream(newStringReader(xml));

    doc = db.parse(is);

    } catch(ParserConfigurationException e) {

    Log.e("Error: ", e.getMessage());

    returnnull;} catch(SAXException e) {

    Log.e("Error: ", e.getMessage());

    returnnull;} catch(IOException e) {

    Log.e("Error: ", e.getMessage());returnnull;

    }

    returndoc;

    }

    publicString getValue(Element item, String str) {

    NodeList n = item.getElementsByTagName(str);

    returnthis.getElementValue(n.item(0));

    }

    publicfinalString 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 ){returnchild.getNodeValue();

    }}

    }

    }

    return"";

    }

    }

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    15/36

    12

    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 numerocon 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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    16/36

    13

    Probamos el webservice, abrimos el navegador y escribimos la direccin 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 ctedra o con el suyo.

    Ejecutamos el servicio, creamos un nuevo dispositivo virtual, con las siguientes caractersticas.

    http://172.16.15.88:8080/CarnetWebApplication/webresources/generic/2http://172.16.15.88:8080/CarnetWebApplication/webresources/generic/2http://172.16.15.88:8080/CarnetWebApplication/webresources/generic/2
  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    17/36

    14

    Y luego ejecutamos.

    Puede ver el proyecto terminado en el repositorio de la asignatura

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    18/36

    15

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    19/36

    16

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    20/36

    17

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    21/36

    18

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    22/36

    19

    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 opcinseleccionada 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 elmaterialpublicode la asignatura.

    Descomprimalos y arrastre los archivos despus de descargados al proyecto.

    Luego clic en finish

    http://aula.fia.ues.edu.sv/materialpublico/pdm115/JSON_IOS.ziphttp://aula.fia.ues.edu.sv/materialpublico/pdm115/JSON_IOS.ziphttp://aula.fia.ues.edu.sv/materialpublico/pdm115/JSON_IOS.ziphttp://aula.fia.ues.edu.sv/materialpublico/pdm115/JSON_IOS.zip
  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    23/36

    20

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

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

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    24/36

    21

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    25/36

    22

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    26/36

    23

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    27/36

    24

    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.

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    28/36

    25

    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 enel 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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    29/36

    26

    Mtodos de parseo.

    Ejecutamos la aplicacin y nos muestra el resultado.

    Puede ver el proyecto terminado en el repositorio de la asignatura

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    30/36

    27

    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:

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    31/36

    28

    Anexo 2 Buscar la direccin IP de nuestra pc de forma visualEn la barra de estado de Windows buscar el icono de red lan(presionar clic)

    Luego clic en Abrir el centro de redes yrecursos compartidos

    Presionamos clic en la opcin Cambiar la configuracin del adaptador

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    32/36

    29

    Presionamos doble clic en Conexin de rea local

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

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    33/36

    30

    Anexo 3 Cdigo Fuente de ViewController.m

    #import "ViewController.h"

    @interfaceViewController()

    @end

    @implementationViewController

    - (void)viewDidLoad{

    [superviewDidLoad];_selectorIP.delegate= self;_selectorIP.showsSelectionIndicator= YES;[self.viewaddSubview:_selectorIP];_ip.text= @"localhost";

    // Do any additional setup after loading the view, typically from a nib.}

    - (void)didReceiveMemoryWarning{

    [superdidReceiveMemoryWarning ];// Dispose of any resources that can be recreated.

    }

    - (IBAction)obtenerRespuesta:(id)sender {NSError*contenidoError = nil;

    NSString*cadenaURL = [NSStringstringWithFormat:@"http://%@%@",_ip.text,_entrada.text];

    if([_banderaisEqualToString:@"si"]) {NSData*dataURL = [NSDatadataWithContentsOfURL:[NSURL

    URLWithString:cadenaURL]];NSString*strResult = [[NSStringalloc] initWithData:dataURL

    encoding:NSUTF8StringEncoding];

    NSError*error1;

    NSDictionary*dir = [[CJSONDeserializerdeserializer]

    deserializeAsDictionary:dataURL error:&error1];

    NSString*res = [dir objectForKey:@"numero"];_respuesta.text=res;

    }else{

    NSURL*miURL = [NSURLURLWithString:cadenaURL];NSData*dataURL = [NSDatadataWithContentsOfURL:miURL

    options:NSDataReadingMappedIfSafeerror:&contenidoError];

    if(!dataURL){

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    34/36

    31

    NSLog(@"Ocurrio un error en la conexion");_respuesta.text= @"Ocurrio un error de conexion";_informacion.text= [NSStringstringWithFormat:@"Compruebe su conexion.

    %@",contenidoError.localizedFailureReason];}else{

    NSString*strResult = [[NSStringalloc] initWithData:dataURLencoding:NSUTF8StringEncoding];

    NSLog(@"%@",strResult);

    NSXMLParser*dataParser = [[NSXMLParseralloc] initWithData:dataURL];[dataParser setDelegate:self];[dataParser parse];_respuesta.text= tmp;_informacion.text= @"Conexion y parseo con exito";

    }

    }[_entradaresignFirstResponder];

    }

    //En este metodo se maneja el evento de cambio de seleccion- (void)pickerView:(UIPickerView*)pickerView didSelectRow: (NSInteger)rowinComponent:(NSInteger)component {

    switch(row) {case0:

    _ip.text= [@""stringByAppendingString:@"172.16.15.88:8080/CarnetWebApplication/webresources/generic/"];

    _bandera=@"no";break;

    case1:_ip.text= [@""

    stringByAppendingString:@"172.16.14.14:8080/CarnetWebApplication/webresources/generic/"];

    _bandera=@"no";break;

    case2:

    _ip.text= [@""stringByAppendingString:@"168.243.8.13:8080/CarnetWebApplication/webresources/generic/"];

    _bandera=@"no";break;

    case3:_ip.text= [@""

    stringByAppendingString:@"carnetpdm115.site40.net/NumeroEnLetras.php?numero="];

    _bandera=@"si";break;

    default:break;}

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    35/36

    32

    }// En este metodo se especifica la cantidad de filas que contendra el picker- (NSInteger)pickerView:(UIPickerView*)pickerViewnumberOfRowsInComponent:(NSInteger)component {

    NSUIntegernumFilas = 5;returnnumFilas;

    }// En este metodo se especifica cuantos componentes tendra cada fila del picker- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView {

    return1;}// Especifica el titulo para cada fila del componente especifico- (NSString*)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)rowforComponent:(NSInteger)component {

    NSString*titulo;switch(row) {

    case0:

    titulo = [@""stringByAppendingString:@"IP Local"];break;case1:

    titulo = [@""stringByAppendingString:@"IP UES PRIVADA"];break;

    case2:titulo = [@""stringByAppendingString:@"IP UES PUBLICA"];break;

    case3:titulo = [@""stringByAppendingString:@"WEB HOSTING"];break;

    default:

    break;}

    returntitulo;}// Especifica el ancho del picker para cada elmento- (CGFloat)pickerView:(UIPickerView*)pickerViewwidthForComponent:(NSInteger)component {

    intsectionWidth = 300;

    returnsectionWidth;}

    -(void) parser: (NSXMLParser*) parser didStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{

    if([elementName isEqualToString:@"string"])//if([elementName isEqualToString:@"numero"])

    tmp=[[NSMutableStringalloc] init];}

    -(void) parser: (NSXMLParser*) parser foundCharacters:(NSString*)string{[tmpappendString:string];

  • 5/21/2018 PDM115 Guia Consumo WSservice 4 OS

    36/36

    33

    NSLog(@"auxString %@",tmp);}

    -(void) parser: (NSXMLParser*) parser parseErrorOccurred:(NSError*)parseError{

    tmp= [[NSMutableStringalloc] init];[tmpappendString:@"Ocurrio un error de Procesos"];

    }

    @end