Introducción
En este laboratorio vamos a realizar peticiones desde un cliente web a un servidor mediante estándares web,
las respuestas obtenidas serán mostradas en un navegador y se dará un paso a través de la historia de como
fue evolucionando la manera de realizar dichas peticiones .
Objetivos
1. Lograr el entendimiento de como se realizan peticiones con el objeto XMLHttpRequest .
4. Utilizar un componente web moderno (web component) desarrollado por un tercero, que nos permitirá
realizar peticiones de una manera mucho más sencilla.
5. Ser capaz de crear y probar cada una de las formas anteriormente referenciadas pata realizar peticiones
Web.
Instalación de Programas
Para nuestro ejercicio VS Code además de cumplir el papel principal, lo utilizaremos como editor para nuestro
código fuente.
Descargar la versión conforme al sistema Operativo en el siguiente enlace: https://code.visualstudio.com/#alt-
downloads
Nota: Las capturas siguientes corresponden a Visual Studio Code 1.33.0 en Windows 10 de 64 bits.
1. Haga doble clic sobre el instalador de Visual Studio Code para que comience el asistente de instalación.
2. La primera pantalla informa que se va a instalar Visual Studio Code. Haga clic en Siguiente para instalar
el programa:
3. La segunda pantalla exige aceptar la licencia de Visual Studio Code para continuar la instalación:
4. La tercera pantalla permite elegir el directorio de instalación (por tratarse de la versión User installer, el
directorio de instalación está en la carpeta de usuario, no en Archivos de programa):
5. La cuarta pantalla permite elegir el nombre de la carpeta del menú de inicio:
6. La quinta pantalla permite elegir algunas tareas adicionales tras la instalación. Personalmente, aconsejo
marcar las casillas "Agregar la acción ...":
7. Finalmente se muestran las opciones elegidas en las pantallas anteriores. Para iniciar la instalación, haga
clic en Instalar:
9. Finalmente VS Code esta instalado de forma correcta, damos clic en Finalizar.
HTML Snippets
Esta extensión la instalamos para hacernos más fácil la creación de código, basta con escribir parte de un
fragmento de código y luego pulsar Intro, inmediatamente el fragmento de código se crea de forma completa,
con sus atributos y etiquetas de cierre.
HTML Bolierplate
Esta extensión proporciona el código HTML estándar utilizado en todas las aplicaciones web, lo vamos a
emplear para crear nuestro 'html5-boilerplate' en un archivo HTML seleccionando el fragmento del menú
desplegable de sugerencias automáticas para obtener el HTML boilerplate.
Prettier
Ahora activaremos para que se haga efectiva la indentación cada vez que le guardemos los cambios en
nuestros archivos en File-->Preferences-->Settings.
Bootstrap4
Bootstrap 4 es la última versión de Bootstrap,el framework de CSS, HTML y JavaScript más popular, que nos
permite desarrollar webs que se ajustan a cualquier resolución y dispositivo (responsive).
Empecemos el Laboratorio
Nuestra fuente de Información
El actor y experto en artes marciales Carlos Ray Norris (mundialmente conocido como Chuck Norris), ha
servido desde hace mucho tiempo como fuente de inspiración de cientos de chistes respecto a su fortaleza,
coraje y determinación. Tal es así, que incluso existe una base de datos oficial (ICNDB) de estos chistes.
Además, esta base de datos posee un API REST muy fácil de usar.
Lo que vamos a implementar es precisamente el consumo de los servicios que ofrece esta API y traernos esos
chistes para mostrarlos en un navegador, lo divertido será darnos un paseo a través de la historia de la
manera como fue evolucionando la manera de realizar las peticiones.
Resolución del laboratorio a la manera de 2005
Para empezar, como en todo proyecto Web moderno, vamos a crear una carpeta de trabajo, por ejemplo
ChistesChuck . A continuación, arrancamos el Visual Studio Code y abrimos esa carpeta:
Nota: VS Code esta por defecto en mi ordenador en idioma Ingles, favor buscar la equivalencia en su
idioma.
Dentro de esa carpeta, crearemos un fichero HTML para comenzar: chuck2005.html , donde
empezaremos a utilizar nuestras extensiones instaladas.
Dentro de nuestro fichero escribiremos html y seleccionamos la que dice html:5
En este ejemplo, se busca el texto de un único chiste, y al encontrarlo, se sustituye el contenido de la primera
etiqueta <h1> de la página web donde se ejecute este script.
Por ende procedemos a crear nuestra etiqueta y nuestro código finalmente deberá quedar así:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<h1>Aqui se coloca el Texto</h1>
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "http://api.icndb.com/jokes/random/", true);
xmlhttp.onreadystatechange = function() {
var textoChiste = JSON.parse(this.response).value.joke;
console.log("chiste recibido: " + textoChiste);
var h1s = document.getElementsByTagName("h1");
h1s[0].innerHTML = textoChiste;
};
xmlhttp.send();
</script>
</body>
</html>
Abrimos nuestro archivo desde un navegador y tenemos un divertido chiste que leer.
Ahora vamos a modificar nuestro ejercicio con el framework Bootstrap4, implementaremos su estilo
CSS y crearemos un elemento Jumbotron.
Crearemos otro fichero HTML chuck2005Bootstrap.html , y volvemos a crear html:5 , pero creamos en
la etiqueta <body> un Jumbotron aprovechando la extensión, colocando b4-jumbotron-default.
Ahora aplicaremos el CSS de Bootstrap, esto lo vamos a realizar con su CDN oficial y sólo tenemos que
colocar el tag en la etiqueta <head> .
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
Y finalmente copiamos el script del archivo anterior chuck2005.html .
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
</head>
<body>
<div class="jumbotron">
<h1 class="display-3">Jumbo heading</h1>
<p class="lead">Jumbo helper text</p>
<hr class="my-2" />
<p>More info</p>
<p class="lead">
<a class="btn btn-primary btn-lg" href="Jumbo action link" role="button"
>Jumbo action name</a
>
</p>
</div>
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "http://api.icndb.com/jokes/random/", true);
xmlhttp.onreadystatechange = function() {
var textoChiste = JSON.parse(this.response).value.joke;
console.log("chiste recibido: " + textoChiste);
var h1s = document.getElementsByTagName("h1");
h1s[0].innerHTML = textoChiste;
};
xmlhttp.send();
</script>
</body>
</html>
Abrimos nuestro archivo desde un navegador y obtendremos un divertido chiste con un estilo agradable y
con el botón creado.
Resolución del laboratorio a la manera de 2006
Crearemos un nuevo fichero HTML al cual llamaremos chuck2006.html
Enlazamos la biblioteca de jQuery, vamos a usar su CDN oficial y copiamos el código en el <head> .
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
Creamos un Jumbotron en la etiqueta <body> aprovechando la extensión, colocando b4-jumbotron-
default.
Con este código estamos realizando una petición get a la API , luego a la variable textoChiste le estamos
asignado el valor de la respuesta que viene en la ruta value.joke (El cual es el chiste) y finalmente a la
etiqueta <h1> le asigna este valor.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
</head>
<body>
<div class="jumbotron">
<h1 class="display-3">Jumbo heading</h1>
<p class="lead">Jumbo helper text</p>
<hr class="my-2" />
<p>More info</p>
<p class="lead">
<a class="btn btn-primary btn-lg" href="Jumbo action link" role="button"
>Jumbo action name</a
>
</p>
</div>
<script>
$.get("http://api.icndb.com/jokes/random", response => {
var textoChiste = response.value.joke;
$("h1").text(textoChiste);
});
</script>
</body>
</html>
Se paso de un bloque extenso de código para realizar el consumo a tres sencillas líneas, las cuales son de fácil
entendimiento.
jQuery simplifica la forma en la que realizamos tareas cómo seleccionar elementos, o realizar peticiones Ajax,
además es Cross browser, de modo que está testada en los siguientes navegadores: I.E. 6.0+, FF2+, Safari
2.0+, Opera 9.0+, Chrome.
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
Enlazamos la biblioteca de jQuery, vamos a usar su CDN oficial y copiamos el código en el <head> .
<script src="http://code.icndb.com/jquery.icndb.js"></script>
Luego creamos nuestra etiqueta <script> en el <body>
$.icndb.getRandomJoke(response => {
var textoChiste = response.joke;
$("h1").text(textoChiste);
});
Con este código estamos realizando una petición get a la libreria jQuery ICNDb , luego a la variable
textoChiste le estamos asignado el valor de la respuesta que viene en la ruta response.joke (El cual es el
chiste) y finalmente a la etiqueta <h1> le asigna este valor.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
<script src="http://code.icndb.com/jquery.icndb.js"></script>
</head>
<body>
<div class="jumbotron">
<h1 class="display-3">Jumbo heading</h1>
<p class="lead">Jumbo helper text</p>
<hr class="my-2" />
<p>More info</p>
<p class="lead">
<a class="btn btn-primary btn-lg" href="Jumbo action link" role="button"
>Jumbo action name</a
>
</p>
</div>
<script>
$.icndb.getRandomJoke(response => {
var textoChiste = response.joke;
$("h1").text(textoChiste);
});
</script>
</body>
</html>
Ahora vamos a modificar nuestro ejercicio usando el método $.icndb.getRandomJokes ,para poblar los
elementos de una lista ordenada (tag <ul></ul> ), de igual forma vamos a agregar un estilo a las listas:
1. Eliminemos el jumbotron de nuestro <body> .
2. Modifiquemos lo que tenemos en nuestro script del body por el siguiente :
$.icndb.getRandomJokes({
number: 10,
success: response => {
response.forEach(element => {
$("ul").append(
"<li class='list-group-item'>" + element.joke + "</li>"
);
});
}
});
A diferencia del anterior código , estamos diciendo que vamos a crear una lista dinámica de 10 chistes y
también tendrá un estilo class='list-group-item'.
3. Creamos en nuestra etiqueta <body> un elemento <ul> , importante agregarle el atributo class , el
cual le aplicará un estilo CSS de Bootstrap.
<ul class="list-group"></ul>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
<script src="http://code.icndb.com/jquery.icndb.js"></script>
</head>
<body>
<ul class="list-group"></ul>
<script>
$.icndb.getRandomJokes({
number: 10,
success: response => {
response.forEach(element => {
$("ul").append(
"<li class='list-group-item'>" + element.joke + "</li>"
);
});
}
});
</script>
</body>
</html>
Abrimos nuestro archivo desde un navegador y tenemos una lista de 10 divertidos chistes.
Al dar f5 o actualizar la página, se recarga con una lista de 10 nuevos divertidos chistes.
Las funciones solo se definian con la palabra function , hoy se pueden definir Función Flecha (arrow)
//ES5
function(){
...
}
//ES6
() => {
...
}
Si la función sólo cuenta con una línea de código, era siempre necesario poner las llaves:
//ES5
array.filter(function (value){
return value > 5;
});
//ES6
array.filter(value => value > 5);
//ES5
array.map(function (value, index){
return {
index: index,
value: value
}
});
//ES6
array.map((value, index) => ({ index: index, value: value
Resolución en 2014
Ahora vamos a consumir la API del método fetch definida por WHATWG , que permite hacer llamadas A JAX de
manera muy limpia.
¿Qué es el WHATWG?
El Web Hypertext Application Technology Working Group, o WHATWG, es una comunidad de personas
interesadas en la evolución de HTML y las tecnologías conexas. El WHATWG fue fundado por integrantes de
Apple , la Fundación Mozilla y Opera Software. Desde entonces, el editor de las especificaciones WHATWG, Ian
Hickson, ha pasado a Google.
La WHATWG tiene un pequeño comité de invitados llamados "miembros" que tienen el poder de impugnar las
especificaciones que propone el editor de estas. Cualquiera puede participar como colaborador, solo tiene
que unirse a la lista de correo de WHATWG.
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
Seguiremos utilizando el estilo CSS de Bootstrap en nuestra etiqueta <head> .
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
Tenemos un bucle que iterara 10 veces haciendo peticiones a la API , luego obtenemos la respuesta en
formato json y creamos una lista dinámicamente asignándole el valor de los chistes json["value"]
["joke"] .
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
/>
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>
</head>
<body>
<ul></ul>
<script>
for (var i = 0; i < 10; i++) {
fetch("http://api.icndb.com/jokes/random")
.then(res => res.json())
.then(
json => $("ul").append("<li>" + json["value"]["joke"]) + "</li>"
);
}
</script>
</body>
</html>
Abrimos nuestro archivo desde un navegador y tenemos una lista de 10 divertidos chistes.
Al dar f5 o actualizar la página, se recarga con una lista de 10 nuevos divertidos chistes.
Ahora Vamos a ejecutar nuestro ejercicio utilizando node-fetch y vamos a imprimirlo en pantalla.
Nota: Las capturas siguientes corresponden desde una terminal cmd.exe en Windows 10 de 64 bits,
ejecútelo en una terminal según tu sistema operativo.
Saldrá un pantallazo con el resumen de la instalación.
Creamos un archivo dentro de nuestro folder y lo nombraremos node-fetch.js
Para garantizar el correcto funcionamiento ejecutamos desde la terminal el comando:
node node-fetch.js
Resolución del ejercicio con Web Components (presente)
Y por fin llegamos a la forma de resolver este ejercicio de la manera más elegante posible: con Web
Components.
Vamos a usar el componente Github , este módulo no se trata de un script de Javascript o un CSS (a la antigua
usanza), si no de un webcomponent moderno. Para usarlo, se necesita la nueva directiva import definida en
las últimas especificaciones del W3C.
Ahora, si queremos un chiste de Chuck Norris, sólo tenemos que incluir este tag en el fichero HTML:
<chuck-norris-joke></chuck-norris-joke>
Nuestro Archivo deberá quedar de la siguiente manera:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="import"
href="https://raw.githubusercontent.com/erikringsmuth/chuck-norris-
joke/master/chuck-norris-joke.html"
/>
</head>
<body>
<chuck-norris-joke></chuck-norris-joke>
</body>
</html>
Ahora vamos a ejecutar nuestro ejercicio utilizando una tabla y para crearle su propio estilo vamos a utilizar el
framework Skeleton , para esto usaremos su CDN .
Copiamos el link en la cabecera <head> :
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.css"
/>
Y usamos Github como CDN, de la siguiente manera:
<link
rel="import"
href="https://raw.githubusercontent.com/erikringsmuth/chuck-norris-
joke/master/chuck-norris-joke.html"
/>
<table class="u-full-width">
<thead>
<tr>
<th>Chistes Chuck Norris</th>
</tr>
</thead>
<tbody>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
</tbody>
</table>
Finalmente nuestro página debe quedar así:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.css"
/>
<link
rel="import"
href="https://raw.githubusercontent.com/erikringsmuth/chuck-norris-
joke/master/chuck-norris-joke.html"
/>
</head>
<body>
<table class="u-full-width">
<thead>
<tr>
<th>Chistes Chuck Norris</th>
</tr>
</thead>
<tbody>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
<tr>
<td><chuck-norris-joke></chuck-norris-joke></td>
</tr>
</tbody>
</table>
</body>
</html>
Abrimos nuestro archivo desde un navegador y tenemos una lista de 10 divertidos chistes en una
tabla con el estilo del Framework Skeleton.
Al dar f5 o actualizar la página, se recarga con una lista de 10 nuevos divertidos chistes en una tabla
con el estilo del Framework Skeleton.