Anatomía de una petición HTTP

Petición HTTP

Cuando trabajamos con Web API’s, la comunicación entre nuestros clientes y nuestro API se va a realizar utilizando peticiones HTTP. Una petición HTTP es un mensaje que una computadora envía a otra utilizando el protocolo HTTP. La petición HTTP las hacen los clientes de nuestro API hacia nuestro API. Cuando nuestro API recibe esta petición, la procesa, y luego retorna una respuesta, llamada respuesta HTTP. Los clientes y nuestro API se van a comunicar utilizando peticiones y respuestas HTTP. Estos mensajes tienen una estructura, y en esta entrada vamos a estudiar dicha estructura.

De manera general, una petición HTTP se divide en 3 partes:

  • Una línea de petición
  • Un conjunto de campos cabecera
  • Un cuerpo, el cual es opcional

Vamos a ver estas partes.

Linea de Petición

En la línea de petición colocamos el método HTTP a utilizar, la URI de la petición y el protocolo HTTP  a utilizar. Es decir, que tienen la estructura siguiente:

METODO-HTTP URI PROTOCOLO-HTTP

Hablaremos de los métodos HTTP en el siguiente post, pero básicamente los métodos HTTP indican qué tipo de acción nuestro cliente quiere realizar, ya sea que quiera leer un recurso, o si quiere enviar información hacia el API, etc. La URI se refiere a la dirección donde se encuentra el recurso. Y el protocolo HTTP se refiere a cual protocolo HTTP se va a utilizar, esto porque existen varias versiones del protocolo HTTP, a la hora de escribir esta entrada, el protocolo más común es el HTTP/1.1, sin embargo, existen otras revisiones más recientes, como la revisión HTTP/2.0.

Veamos un ejemplo de una línea de petición:

GET /api/autores HTTP/1.1

Vemos que el método HTTP es GET, lo que significa que queremos leer un recurso, ¿Cuál recurso? Pues el que se indica más adelante, en /api/autores. Finalmente, se nos indica el protocolo HTTP a utilizar. Entonces, esta línea de petición indica a nuestro API que un usuario o cliente quiere leer el recurso encontrado en la URI /api/autores.

Veamos otro ejemplo

POST /test.html HTTP/1.1

Aquí el método es POST, lo que quiere decir que el usuario quiere enviarnos algo. Ese algo que quiere enviar lo vamos a encontrar en el cuerpo de la petición, esto lo veremos en unos minutos. Vemos que la URI es /test.html, y el protocolo es HTTP/1.1.

La segunda parte de una petición HTTP es la cabecera.

Cabecera de la petición

La cabecera de la petición es donde se encuentran las cabeceras de la petición. Las cabeceras son metadatos que se envían en la petición para brindar información sobre la petición. Cada cabecera se especifica con un nombre, luego dos puntos, y luego seguido por el valor de dicha cabecera.

Veamos un ejemplo de una cabecera:

Host: en.wikipedia.org

En este caso, el nombre de la cabecera es Host, y su valor es en.wikipedia.org. La cabecera Host indica el dominio del servidor.

Otro ejemplo de cabecera sería

Cache-Control: no-cache

El nombre de esta cabecera es Cache-Control, y su valor es no-cache.

En la cabecera de la petición puede haber múltiples cabeceras. Vamos a ver un ejemplo de una petición con su línea de petición y cabecera:

GET /api/autores HTTP/1.1
Host: en.wikipedia.org
Cache-Control: no-cache

Aquí vemos que la primera línea es la línea de petición, debajo de esta se encuentra la cabecera de la petición, la cual se compone de varias cabeceras individuales, host y cache-control en nuestro caso.

Las cabeceras Host y Cache-Control son cabeceras estándar, que ya tienen un propósito bien definido. Sin embargo, tenemos libertad de utilizar nuestras propias cabeceras personalizadas. Cuando necesitamos expresar nuestra metadata de nuestra petición, podemos utilizar cabeceras personalizadas. Lo único que necesitas hacer es mandarla en la cabecera de la petición HTTP.

Vamos ahora a ver la tercera y última parte de una petición HTTP, el cuerpo.

Cuerpo de la petición

El cuerpo de la petición es donde colocamos información adicional que vamos a enviar al servidor. En el cuerpo de la petición tenemos libertad de colocar virtualmente lo que queramos. Desde el nombre de usuario y password de un persona que intenta loguearse a nuestro sistema, hasta las respuestas de un complejo formulario de una escuesta. El cuerpo es bastante importante, pues representa, en muchos casos, el contenido per se que se quiere transmitir.

Descatamos que las peticiones GET no utilizan un cuerpo, porque uno no tiende a enviar muchos datos complejos a la hora de leer información. En el caso del método POST, sí solemos utilizar el cuerpo de la petición para colocar lo que queremos enviar.

Veamos un ejemplo de un cuerpo de la petición:

Hola

Aquí tenemos una simple “Hola”. El cuerpo de la petición es para mandar virtualmente lo que queramos, desde un simple saludo, hasta una información un poco más estructurada, como la siguiente:

{
    "Nombre": "Felipe Gavilán",
    "Edad": 999
}

Aquí tenemos una información en formato JSON que representa el cuerpo de nuestra petición.

Vamos a ver entonces una petición HTTP con sus tres partes:

POST /api/autores HTTP/1.1
Host: miWebApi.com
Content-Type: application/json
Cache-Control: no-cache

{
     "Nombre": "Felipe Gavilán",
     "Edad": 999
}

La petición que estamos viendo es un POST hacia el recurso /api/autores. Tenemos una cabecera compuesta de 3 cabeceras: Host, Content-Type y Cache-Control. Y finalmente, al fondo tenemos el cuerpo de la petición. Fíjate que una línea en blanco es la separación entre la cabecera HTTP  y el cuerpo.

Respuesta HTTP

Tal cual dijimos al principio de esta entrada, cuando el cliente nos envía una petición HTTP, nuestro servidor debe de responder con una respuesta HTTP. La respuesta HTTP también tiene su propia estructura, la cual es bastante similar a la estructura de la petición. Estas partes son:

  • Linea de estatus
  • Cabecera
  • Cuerpo, el cual es opcional

En la línea de estatus se nos indica el estatus de la petición, es decir, si fue exitosa, si hubo un error, o si se requiere que tomemos algún tipo de acción. Los códigos de estatus HTTP los vemos más adelante. La cabecera es un conjunto de cabeceras, igual que la cabecera de la petición. El servidor puede enviarnos tantas cabeceras como desee. Y, finalmente, el servidor tiene la opción de enviar un cuerpo con la data que desea transmitirnos. Aunque el cuerpo también es opcional, es bastante fundamental a la hora de utilizar páginas web, ya que es a través del cuerpo que recibimos el HTML de una pagina web que queremos visualizar en nuestro navegador web.

Ejemplo de una respuesta HTTP:

HTTP/1.1 200 OK
Date: Thu, 03 Jan 2019 23:26:07 GMT
Server: gws
Accept-Ranges: bytes
Content-Length: 68894
Content-Type: text/html; charset=UTF-8

<!doctype html><html …

En la primera linea tenemos la linea de estatus, la respuesta fue un 200 OK. Luego tenemos las cabeceras de la respuesta. Finalmente, separado por una linea en blanco de las cabeceras, tenemos el cuerpo de la respuesta, que en este caso es un documento HTML.

Resumen

Una petición HTTP se divide en tres partes: Linea de petición, cabecera y cuerpo. Una respuesta HTTP también se divide en tres partes: Linea de estatus, cabecera y cuerpo.

Leave a comment