HTTP ("HyperText Transfer Protocol") es un lenguaje basado en texto que permite a dos máquinas comunicarse entre sí. ¡Eso es todo! La siguiente conversación es la que por ejemplo tiene lugar cuando quieres acceder a la última tira cómica publicada por el sitio xkcd:
Y aunque el lenguaje realmente utilizado es un poco más formal, sigue siendo bastante simple.
HTTP es el término utilizado para describir este lenguaje simple basado en texto. Y no importa cómo desarrolles en la web, el objetivo de tu servidor siempre es entender las peticiones de texto simple, y devolver respuestas en texto simple.
Symfony2 está diseñado en base a esa realidad. Aunque a veces no te des cuenta, HTTP es algo que usas todos los días. Con Symfony2, aprenderás a dominarlo.
1.1.1. Paso 1: El cliente envía una petición
Todas las conversaciones en la web comienzan con una petición. La petición es un mensaje de texto creado por un cliente (por ejemplo un navegador, una aplicación para el iPhone, etc.) en un formato especial conocido como HTTP. El cliente envía la petición a un servidor, y luego espera la respuesta.
Echa un vistazo a la primera parte de la interacción (la petición) entre un navegador y el servidor web del sitio xkcd
:
Utilizando el lenguaje HTTP, esta petición en realidad sería algo parecido a lo siguiente:
GET / HTTP/1.1 Host: xkcd.com Accept: text/html User-Agent: Mozilla/5.0 (Macintosh)
Este sencillo mensaje comunica todo lo necesario sobre qué recursos exactamente solicita el cliente. La primera línea de una petición HTTP es la más importante y contiene dos cosas: la URI y el método HTTP.
La URI (por ejemplo, /
, /contacto
, etc.) es la dirección o ubicación que identifica unívocamente al recurso que solicita el cliente. El método HTTP (por ejemplo, GET
) define lo que quieres hacer con el recurso. Los métodos HTTP son los verbos de la petición y definen las pocas formas en que puedes actuar sobre el recurso:
Método | Acción |
---|---|
GET |
Recupera el recurso desde el servidor |
POST |
Crea un recurso en el servidor |
PUT |
Actualiza el recurso en el servidor |
DELETE |
Elimina el recurso del servidor |
Teniendo esto en cuenta, puedes imaginar cómo sería por ejemplo la petición HTTP necesaria para borar un artículo específico de un blog:
DELETE /blog/15 HTTP/1.1
Nota En realidad, hay nueve métodos HTTP definidos por la especificación HTTP, pero muchos de ellos no se utilizan o no están soportados. De hecho, muchos navegadores modernos no soportan los métodos PUT
y DELETE
.
Además de la primera línea, una petición HTTP contiene también otras líneas de información conocidas como cabeceras de petición. Las cabeceras proporcionan mucha información, como el servidor (o host
) solicitado, los formatos de respuesta que acepta el cliente (Accept
) y la aplicación que utiliza el cliente para realizar la petición (User-Agent
). Existen muchas otras cabeceras y se pueden encontrar en el artículo Lista de campos de las cabeceras HTTP en la Wikipedia.
1.1.2. Paso 2: El servidor devuelve una respuesta
Una vez que un servidor ha recibido la petición, sabe exactamente qué recursos necesita el cliente (a través de la URI) y lo que el cliente quiere hacer con ese recurso (a través del método). Por ejemplo, en el caso de una petición GET
, el servidor prepara el recurso y lo devuelve en una respuesta HTTP. Considera la respuesta del servidor web del sitio xkcd
:
Traducida a HTTP, la respuesta enviada de vuelta al navegador es similar a lo siguiente:
HTTP/1.1 200 OK Date: Sat, 02 Apr 2011 21:05:05 GMT Server: lighttpd/1.4.19 Content-Type: text/html <html> <!-- HTML de la tira cómica de Xkcd --> </html>
La respuesta HTTP contiene el recurso solicitado (en este caso, el contenido HTML de una página web), así como otra información acerca de la respuesta. La primera línea es especialmente importante y contiene el código de estado HTTP (200
en este caso) de la respuesta. El código de estado indica el resultado global de la petición devuelta al cliente. ¿Tuvo éxito la petición? ¿Hubo algún error? Existen diferentes códigos de estado que indican éxito, error o qué más se necesita hacer con el cliente (por ejemplo, redirigirlo a otra página). La lista completa se puede encontrar en el artículo Lista de códigos de estado HTTP en la Wikipedia.
Al igual que la petición, una respuesta HTTP contiene datos adicionales conocidos como cabeceras HTTP. Por ejemplo, una cabecera importante de la respuesta HTTP es Content-Type
. Un mismo recurso se puede devolver en varios formatos diferentes (HTML, XML, JSON, etc.) y la cabecera Content-Type
dice al cliente qué formato se ha utilizado (para ello utiliza valores estándar como text/html
que se conocen como Internet Media Types). Puedes encontrar la lista completa de tipos de contenido en el artículo Lista de tipos de contenido de Internet en la Wikipedia.
Existen muchas otras cabeceras, algunas de las cuales son muy importantes. Por ejemplo, ciertas cabeceras se pueden usar para crear un sistema de memoria caché bastante interesante.
1.1.3. Peticiones, respuestas y desarrollo web
Esta conversación petición-respuesta es el proceso fundamental en el que se basa toda la comunicación en la web. Y a pesar de ser tan importante y poderoso, al mismo tiempo es muy sencillo.
El concepto más importante es el siguiente: independientemente del lenguaje que utilices, el tipo de aplicación que construyas (web, móvil, API), o la filosofía de desarrollo que sigas, el objetivo final de una aplicación siempre es entender cada petición y crear y devolver la respuesta adecuada.
Symfony está diseñado para adaptarse a esta realidad.
Truco Puedes obtener más información acerca de la especificación HTTP, en la referencia original HTTP 1.1 RFC. También puedes leer la referencia HTTP Bis, que es una versión actualizada y más detallada de la referencia anterior. Una gran herramienta para comprobar tanto la petición como las cabeceras de la respuesta mientras navegas es la extensión Live HTTP Headers de Firefox o el Inspector Web de los navegadores Chrome y Safari.