Upload
franklin-portillo
View
20
Download
0
Embed Size (px)
DESCRIPTION
Consumo WSservice
Citation preview
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/25/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.zip5/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