<style>
.reveal section img { background:none; border:none; box-shadow:none; }
.reveal blockquote { width: 90% }
#attribution { font-size: 12px; }
.reveal code.htmlmixed { font-size: 15px; }
</style>
# Introducción a las aplicaciones web
---
[TOC]
---
## ¿Qué son las aplicaciones web?
- Son del tipo cliente-servidor
- El cliente (`User-agent`) y el servidor intercambian mensajes usando protocolo HTTP
- HTTP es un protocolo sin estado, es decir, no guarda ninguna información sobre conexiones anteriores
---
## Recursos
Se localizan mediante una URL (Uniform Resource Locator)

<div id="attribution">
OmenBreeze [<a href="https://creativecommons.org/licenses/by-sa/4.0">CC BY-SA 4.0</a>], <a href="https://commons.wikimedia.org/wiki/File:URI_syntax_diagram.svg">via Wikimedia Commons</a>
</div>
Note:
+ `scheme` típicamente `http`, `https`, `ftp`, `mailto`, `file`, `data`
+ `userinfo` opcional, `usuario:contraseña` seguido de `@`
+ `host` nombre registrado en el DNS o dirección IP
+ `port` opcional, puerto TCP
+ `path` lista de `segments` separados por `/`
+ `query` opcional, generalmente pares atributo-valor
+ `fragment` opcional, identifica un subrecurso
---
## Métodos (verbos) de HTTP
Indican qué acción se quiere realizar sobre un recurso
+ `GET` obtener recurso
+ `HEAD` obtener recurso pero solo las cabeceras
+ `POST` enviar una nueva instancia de un recurso
+ `PUT` reemplaza los datos de un recurso existente
+ `DELETE` borra la instancia de un recurso
+ `OPTIONS` obtiene las opciones de comunicaciòn con un recurso
+ `PATCH` modifica parcialmente un recurso
---
## Formato de un mensaje HTTP
### Petición
```
Verbo Recurso HTTP/1.1
Cabeceras
[línea en blanco]
```
### Respuesta
```
HTTP/1.1 CodigoRespuesta Recurso
Cabeceras
[línea en blanco]
Body
```
----
### Códigos de respuesta
| Código | Significado | Código | Significado |
| -------- | ----------- | -------- | -------------------- |
| `10X` | Informativo | `401` | No autorizado |
| `20X` | Satisfactorio | `404` | No encontrado |
| `30X` | Redirect | `500` | Internal server error |
| `40X` | Errores del cliente | `507` | No disponible
<div id="attribution">
http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
</div>
---
## Ejemplo de diálogo
### Petición
```
$ curl -v -s https://www.uah.es/es/ > /dev/null
[...]
> GET /es/ HTTP/1.1
> Host: www.uah.es
> User-Agent: curl/7.54.0
> Accept: */*
>
[...]
```
---
### Respuesta (`headers`)
```
< HTTP/1.1 200 OK
< Date: Wed, 27 Nov 2019 11:57:14 GMT
< Server: Apache/2.4.6 (Red Hat)
< Set-Cookie: JSESSIONID=D76A8FCE1A05227BC046C17EBF0D6E1F; Path=/; HttpOnly
< Last-Modified: Wed, 27 Nov 2019 11:57:15 GMT
< Cache-Control: public, max-age=0
< Content-Length: 281761
< Vary: Accept-Encoding,User-Agent
< Connection: close
< Content-Type: text/html;charset=UTF-8
<
```
---
### Respuesta (`body`)
```htmlmixed
<!DOCTYPE html>
<html lang="es" >
<head>
<title>Universidad de Alcalá (UAH) Madrid</title>
<link rel="stylesheet" href="/plugins/bootstrap/css/bootstrap.css" type="text/css">
<script type="text/javascript" src="/scripts.."></script>
[...]
</head>
<body>
<h1 class="sr-only">Universidad de Alcalá (UAH) Madrid</h1>
[...]
<img src="/galleries/imagenes/logo1.png" />
[...]
</body>
</html>
```
---
### ¿Esto es todo?
No. La respuesta al GET inicial fue:
`Content-Type: text/html;charset=UTF-8`
Lo que viene en el body es un doc HTML (DOM). Hay que descargar (GET) todas las referencias de ese DOM: imágenes, scripts, letras, media, etc...
---
### Falta descargar los contenidos estáticos
| | |
|---|---|
| 
---
## Recursos dinámicos vs estáticos
+ Los contenidos estáticos:
+ No varían
+ Son compartidos por todos los usuarios
+ Pueden ser cacheados
+ Los contenidos dinámicos:
+ Cambian de una petición a otra
+ Hay que generarlos puntualmente en cada petición
+ No son cacheables
---
### Técnicas para servir recursos estáticos
+ Usando un servidor web, p.e. `nginx`, `apache2`, etc.
+ Usando buckets:
+ Cloud Storage en Google
+ S3 en AWS
+ En ambos casos debe ser posible identificar qué recursos son estáticos
```
https://www.miapp.com/static/css/styles.css
https://www.miapp.com/static/images/pic01.png
```
---
### Técnicas para servir recursos dinámicos
Cuando se pide un recurso dinámico se debe ejecutar un proceso que en función de una determina lógica elabore la respuesta adecuada
A este tipo de software se le denomina Web Applications, Aplicaciones Web o WebApps
[Introducción a Flask](/8JxYmfbaQV2DEIdgosrjlQ)
---
## ¿Quién es el destinatario de la información?
`GET /weather?q=Alcalá`
---
### ¿Humanos :person_with_pouting_face:?
+ `Content-type: text/html`
+ Imágenes, estilos, multimedia, css, etc.

---
### ¿Máquinas :computer:?
+ Ejemplo: evaluar riesgos climatológicos
+ `Content-type: application/json`
+ Información estructurada: `JSON` o `XML`
<style></style>
```json=
{
"coord": { "lon": 139,"lat": 35},
"base": "stations",
"main": {
"temp": 289.92,
"pressure": 1009,
"humidity": 92,
"temp_min": 288.71,
"temp_max": 290.93
},
```
:bulb:[Podríamos acordar la forma de intercambiar información usando HTTP](/@ogarcia/restful)
{"metaMigratedAt":"2023-06-15T01:49:42.228Z","metaMigratedFrom":"YAML","title":"Introducción a las aplicaciones web","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":\"white\"}","contributors":"[{\"id\":\"93855254-5bcf-438a-b2d1-f9f805e036e4\",\"add\":9448,\"del\":6122}]"}