Aprendiendo Ext JS 3

El objeto Ajax, peticiones GET y POST Más videos

Descripción del tema

La comunicación con el servidor es parte vital en las aplicaciones Web. Enviar y recibir información sin que la página se actualice por completo es sencillo utilizando Ajax, en este tema veremos como realizar peticiones GET y POST utilizando el Framework de Ext JS.

Material de apoyo

Para este tema es necesario descargar el material de apoyo, descomprimirlo y copiar los archivos al servidor Web que hemos instalado previamente, dentro de la carpeta curso creamos un directorio que se llame “ajax”, dentro de este pegamos los archivos del material de apoyo (ajax.html, ajax.js, ajax.php).

Namespace

Lo primero que debemos hacer es “empaquetar” el código que escribiremos, asignarle un namespace donde será ejecutado, de esta manera evitamos coaliciones.
//el namespace para este tutorial
Ext.ns('com.quizzpot.tutorial');

com.quizzpot.tutorial.Ajax = {
	init: function(){
		//el código va aquí
	}
}

//cuando esté listo el DOM ejecutamos la función “init”
Ext.onReady(com.quizzpot.tutorial.Ajax.init,com.quizzpot.tutorial.Ajax);

Crear los eventos

El siguiente paso es crear un “listener” para el evento “click” de los botones que se encuentran en el documento HTML, y dentro de éste vamos a realizar las llamadas Ajax.
//cuando se de clic sobre el botón “json”…
Ext.fly('json').on('click',function(){
	//hacemos una petición por Ajax al servidor
},this);

//hacemos lo mismo para los otros dos botones…
Ext.fly('xml').on('click',function(){
			
},this);
	
//que tenemos en el documento HTML	
Ext.fly('html').on('click',function(){
		
},this);

Ajax

Dentro de la función que se ejecutará cuando el usuario presione el botón “json” vamos a poner lo siguiente:
Ext.Ajax.request({ //dispara la petición
	url: 'ajax.php', //la URL donde se realiza la petición
	method:'GET', //El método HTTP usado para la petición
	params:{format:'json'},//los parámetros que se usaran para la solicitud
	success: this.log, //si se logró la comunicación, ejecuta la función “log”
	failure: this.fail, //si falla, ejecuta la función “fail”
	scope:this //especifica el contexto de las funciones anteriores
});
Como puedes ver en el código anterior, para realizar una petición por medio de Ajax, utilizamos el componente “Ext.Ajax”, no podemos crear instancias de este objeto ya que es un singleton, es por eso que lo podemos utilizar sin crear instancias, únicamente ejecutamos el método “request” y le pasamos un objeto con las configuraciones necesarias. En la propiedad “url” se especifica donde será realizada la solicitud, en este caso “ajax.php” pero esto variará dependiendo de tus necesidades, algo muy importante por aclarar es que por ningún motivo deberías de ponerle parámetros a la url (ej: ajax.php?param=hola&id=2&module=/index), he visto muchas veces que algunos desarrolladores cometen esta “barbaridad”; esto no debe hacerse para pasar parámetros al servidor, ya que en el mismo objeto de configuración podemos definir los parámetros que necesitemos. La propiedad “params” es responsable de enviar todos los parámetros que necesitemos, aquí es donde los definimos como un objeto ({name: 'value', param2:2}), usando un String (name=value¶m2=2) o podemos asignarle una función la cual regresará los parámetros necesarios, esto es útil para cuando los parámetros son variantes y existen condiciones y reglas para enviar los parámetros correctos. En la propiedad “method” se especifica el método http que utilizará la solicitud (POST, GET, PUT y DELETE), si no se especifica un tipo entonces toma GET si no se han enviado parámetros (usando la propiedad “params”), y POST si se han especificado parámetros. Es importante mencionar que la propiedad “success” (del objeto de configuración) recibe una referencia a la función “log” la cuál aún no hemos escrito, esta función será ejecutada luego de que el servidor responda satisfactoriamente, esto quiere decir que puede demorar en ejecutarse dependiendo de la carga del servidor; igualmente la propiedad “failure” será ejecuta la función asignada cuando se produzca un error en el servidor o en la comunicación (404 not found, 403 forbidden, 500 server error, etc…). Ahora vamos a realizar las peticiones para los otros botones que nos hacen falta:
//lo mismo para los otros dos botones…
Ext.fly('xml').on('click',function(){
	Ext.Ajax.request({
		url: 'ajax.php',
		params:{format:'xml'}, //en formato XML
		success: this.log,
		failure: this.fail,
		scope:this
	});
},this);
	
//que tenemos en el documento HTML	
Ext.fly('html').on('click',function(){
	Ext.Ajax.request({
		url: 'ajax.php',
		success: this.log,
		failure: this.fail
	});
},this);
Si has notado, la configuración de estas peticiones no es exactamente igual, ha variado muy poco, esto con el propósito de mostrar la flexibilidad del componente.

La función success

Es necesario escribir la función que se ejecutará cuando todo suceda correctamente, en este caso la función “log”, la cual será un método del objeto “com.quizzpot.tutorial.Ajax”.
, //<---no olvidar esta coma para separar entre los métodos
	
/***************************************
 *	If the request is successful …
 ***************************************/
log: function(response,options){//recibe la respuesta y el objeto de configuración
	var el = Ext.get('response'); // tomar el LOG
	var text = response.responseText; //remover el...
	text = text.replace(/</g,'&lt;'); // < y...
	text = text.replace(/>/g,'&gt;'); // >
	el.select('p.newest').removeClass('newest'); // remover el ultimo update
	Ext.DomHelper.append(el,'<p class="newest">'+text+'</p>'); //update el log
	el.scrollTo('top',el.dom.scrollHeight); //posicionar el scroller al fondo
	el.select('p.newest').highlight('00ff66',{duration:0.5}); //highlight el ultimo mensaje
}
Lo más importante del código anterior es que la función recibe dos parámetros, el primero es la respuesta del servidor el objeto XMLHttpRequest, y el segundo parámetro es el objeto de configuración, el resto del código no tiene mucha importancia comentarlo ya que debe ser remplazado por la funcionalidad que cada uno quiera implementar, pero si es importante mencionar que aquí es donde se debe tratar con la información regresada.

La función failure

En caso de suceder un error debemos saber como manejarlo, el siguiente código es disparado cuando un error ha sucedido en la comunicación o bien en el servidor.
, //<--- coma separadora de los métodos
	
/***************************************
 *	If the request fails, log the error
 ***************************************/
fail: function(response,options){
	var el = Ext.get('response');
	el.select('p.newest').removeClass('newest');
	Ext.DomHelper.append(el,'<p class="newest"><strong>Error Status '+response.status+' '+response.statusText+'</strong>: Opsss, there is something wrong! please try again</p>');
	el.scrollTo('top',el.dom.scrollHeight);
	el.select('p.newest').highlight('ff1111',{duration:0.5});
}
Simplemente se le informa al usuario que ha sucedido un error, nada complicado, pero cada quien es responsable de implementar lo que sea necesario en su proyecto.

El servidor

Este curso es de Ext JS, por lo tanto no voy a explicar el código utilizado en el servidor a detalle puesto que es simplemente un ejemplo que no tiene utilidad alguna en el mundo real, pero si te diré que es lo que hace.
<?php 
	
	if(rand(1,4) == 1){
		if(rand(1,2)==1)
			header("HTTP/1.0 404 Not Found"); 
		else
			header("HTTP/1.0 403 Forbidden"); 
		exit;
	}
	
	$type = $_SERVER['REQUEST_METHOD'];
	$msg = new Message("This is a ".$type." request!",true);
	
	$format = $type=='GET'? $_GET['format']:$_POST['format']; 
	
	switch($format){
		case 'xml':
			header("Content-Type: text/xml"); 
			echo $msg->toXML();
			break;
		case 'json':
			header("Content-Type: text/plain"); 
			echo $msg->toJSON();
			break;
		default:
			header("Content-Type: text/html"); 
			echo $msg->toHTML();
	}
	
	class Message{
		protected  $msg,$success;
		
		public function __construct($msg,$success) {
			$this->msg = $msg;
			$this->success = $success;
		}
	
		public function toXML(){
			return "<response><success>".$this->success."</success><msg>".$this->msg."</msg></response>";
		}
		
		public function toJSON(){
			return "{success:".$this->success.",msg:'".$this->msg."'}";
		}
		
		public function toHTML(){
			return '<p>'.$this->msg.'</p>';
		}
	}
?>
Primero aleatoriamente manda errores, ya sea un 404 o un 403, he creado una clase “Message” la cual toma un mensaje y una bandera en el constructor, cuenta con tres métodos los cuales retornan el mensaje en diferentes formatos, los cuales mediante un switch son invocados e impresos en el explorador.

Conclusiones

El uso de Ajax es muy importante en nuestras aplicaciones, Ext JS ha revolucionado la manera en como desarrollamos nuestros sistemas o aplicaciones, este componente es fundamental en el Framework y es necesario conocerlo para usarlo apropiadamente, te recomiendo mires el API y juegues un poco con este componente. Como siempre dudas o sugerencias son recibidas en los comentarios.

Te gustaría recibir más tutoriales como este en tu correo?

Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.

Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!

Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.

¿Olvidaste tu contraseña?

24Comentarios

  • Avatar-3 Crysfel 17/04/2009

    Sorry por no hacer video, pero estoy enfermo de la garganta y no puedo hablar bien :(

  • Avatar-8 cristian 19/04/2009

    Crysfel Excelente impresionante el curso que estas realizando y la facilidad de la explicacion sin ondar con conceptos complejos. Esta pagina esta en mis favoritos y siempre esperando una nueva entrega del curso. impresionante. te felicito

    • Avatar-5 Darian 22/04/2009

      Cryfel me gusta mucho los cursos que impartes son bastante interezante y muy útil para mi trabajo de tesis que desarrollo ahora. Te agradecería cualquier ayuda que me brindaras en estos cursos que impartes!! escribeme a mi mail...gracias!!

      • Avatar-12 Rodolfo 10/06/2009

        excelente ... quizas mencionar que tambien el framework soportan los metodos PUT DELETE (REST FUL) que hoy esta tan de moda, ademas objetos JSON como transporte (DTO o VO depende del caso) :-) algo asi : <pre name="code" class="javascript"> Ext.Ajax.request({ waitMsg: 'Wait...', url: 'url...', method: 'PUT', headers: { 'Content-Type':'text/json' }, jsonData: objectVO, failure: function(response, options) { ... ... </pre>

        • Avatar-4 jucahoca 08/07/2009

          Otro método que he usado con éxito es el HEAD. Lo usaba para saber de la existencia de un fichero sin pedirle el contenido al webserver. Especialmente interesante si se trata de ficheros que en el caso de existir ocupan varios MB

          • Avatar-3 cesar edinson 12/07/2009

            Excelente material de etxJS ... Señor Crysfel . no seria mala idea que publique un Libro sobre este Framework... Saludos desde el Perú

            • Avatar-9 Marco 15/12/2009

              Excelente tutorial, solo una pregunta, se podra usar ajax para por ejemplo bajar un archivo del server, en lugar del común window.open(url)

              • Avatar-12 Crysfel 18/12/2009

                no precisamente Ajax, pero lo que puedes hacer es un "controlador" o un script en PHP que te gestione las descargas modificando las cabeceras del response para que automáticamente se comience a bajar un archivo y luego mediante un window.location puedes iniciar la descarga

                • Avatar-5 Rodolfo 14/05/2010

                  Como se invoca un metod POST con servicios RESTful si el servicio espera un Entity, no parametros y tampoco una forma ? El servicio espera un Entity en la forma JSON o XML Muchas gracias por anticipado

                  • Avatar-3 tierrarara 14/05/2010

                    como se hace para obtener una respuesta json, como la manejas

                    • Avatar-12 Henry 14/08/2010

                      hola, quisiera que me ayudaran con un problema, cuando le agrego parametros al ajax params:{autor:'fsdf',title:'sfsdf'} no se ejecuta el codigo de la url pero si no pongo parametros si lo hace. Por favor ayuda

                      • Avatar-6 Ronald Mayta 18/02/2011

                        Crysfel, Muy Bien, casi excelente, pero cabe mensionar que no estas Utilizando AJAX sino AJAJ (JSON en lugar de XML). Saludos, sigue adelante, muy buen trabajo!!. Ronald Mayta Software Developer PHP - Java

                        • Avatar-2 Hector Garcia 24/05/2011

                          como hacer para hacer dos peticiones AJAX, es decir, que no me ejecute una sino ha terminado la otra? Gracias....

                          • Avatar-6 Rambaldi 11/08/2011

                            Ojala nos responda. Por que tengo una problematica como la que plateas Hector.

                            • Avatar-8 Enrique Geovanny Correa Gualoto 09/01/2012

                              lasjlfjklasdf

                              • Avatar-4 Arnoldo Machado 19/04/2013

                                Excelente pero porque usaste la imagen del jabon quita grasa XD

                                • Avatar-7 Michael 03/12/2013

                                  Saludos, excelente curso. Tengo una aplicación para la matriculación y control de notas de una institución educativa, ya lo tengo bastante avanzado pero me estanque en un formulario. Si pudieras ayudarme estaría muy agradecido, por mail para entrar en detalles.

                                  • Avatar-2 joaquin_virgo_2007 08/03/2014

                                    Yo solo tengo un problema en este codigo. el.select('p.newest').removeClass('newest'); // remover el ultimo update que me reporta como: "Uncaught TypeError: Object [object Object] has no method 'removeClass' ", lo demas esta OK

                                  • Avatar-10 Roxana 19/05/2014

                                    saludos, Muy bien la explicacion me sirvio de mucho :)

                                    • Avatar-3 rey 13/05/2016

                                      Hola quisiera pedir alluda. Tengo que trasformar un listado de urls en un listado de documentos usando $.ajax, pero no tengo idea de como puedo lograr esto, e empesado un codigo pero no estoy seguro de ir por buen camino, agradezco cualqwuiewr alluda. Saludos!! Este es el codigo var urls = ['http://acamica.com/doc1', 'http://acamica.com/doc2', 'http://acamica.com/doc3']; async.map(urls, $.ajax, function(success, err){ // urls transformadas en documentos });

                                      • Avatar-1 titoHolo 12/05/2023

                                        ????????,??No.1????????????????????????????????????????????????? ?????????????????????2???????,????? ??????? ??,????????? ???n??????? }}}}}} https://www.kopijp.com/product/detail.aspx-id=2557.htm

                                        • Avatar-11 Prulado 14/05/2023

                                          ??????????????????????????????????????????????????????? ??????????? ???????????? ??????????????????????????? ???????????????????????????????? ????????????? ???????? }}}}}} https://www.bagssjp.com/product/detail-11622.html https://www.bagssjp.com/product/detail-11888.html https://www.bagssjp.com/product/detail-4348.html https://www.bagssjp.com/product/detail-8633.html https://www.bagssjp.com/product/detail-3826.html

                                          Instructor del curso

                                          Crysfel3

                                          Autor: Crysfel Villa

                                          Es ingeniero de software con más de 7 años de experiencia en desarrollo web.

                                          Descarga Código Fuente Ver Demostración

                                          Regístrate a este curso

                                          Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.

                                          Tendrás acceso a descargar los videos, códigos y material adicional.

                                          Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.

                                          Llevarás un registro de tu avance.