-
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