Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

El Protocolo HTTP


Cita con formato IEEE:
E. Bahit, "Consumo y producción de APIs con arquitecturas REST/JSON", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 233-245.

Cita con formato APA 7:
Bahit, E. (2022). Consumo y producción de APIs con arquitecturas REST/JSON. In Python Aplicado (4th ed., pp. 233-245). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

Para entender cómo consumir y producir interfaces de programación de aplicaciones, es necesario comprender que la base de una API está en el conocimiento del protocolo HTTP. Si se entiende el protocolo, para consumir una API solo resta emplear una biblioteca que permita realizar solicitudes HTTP, y para producirla, bastará con crear recursos que en vez de vistas, retornen datos, y que por otra parte, constaten que la solicitud HTTP haya sido correcta.

El protocolo HTTP está basado en una arquitectura cliente-servidor. Esta arquitectura plantea dos componentes (programas) conectados sobre una red informática:

Los clientes solicitan al servidor un recurso, el servidor acepta la solicitud, y retorna al cliente los resultados de la ejecución.

Los recursos provistos por el servidor (funcionalidades que el servidor puede llevar a cabo), son ofrecidos mediante un identificador uniforme de recurso (URI), también conocido como localizador uniforme de recursos (URL).

En lo que a HTTP concierne, los identificadores uniformes de recursos, es decir, los URI o URL, son cadenas de texto simple que permiten identificar mediante un nombre o localización, un recurso específico (lo que a los ojos del software, sería una funcionalidad concreta o un paso en una funcionalidad).

Un URI HTTP puede indicarse en uno de dos formatos: absoluto o relativo. Es absoluto cuando incluye el esquema “http” seguido de dos puntos, y es relativo cuando provee el nombre del recurso sobre una base conocida (host). El esquema “http” se utiliza para localizar recursos bajo el protocolo homónimo (HTTP) empleando el siguiente formato:

http://<host>[:<puerto>][<ruta absoluta del recurso>][?<cadena de consulta>]

Un ejemplo completo podría verse como el siguiente:

http://www.elidabahit.co.uk:8080/ruta/absoluta?consulta=una+cadena+cualquiera

Cuando el puerto no es indicado en el URI, por defecto, el protocolo entiende que el acceso será a través del puerto 80.

Las solicitudes HTTP se envían en una sola línea sin saltos (excepto al final). Una solicitud HTTP presenta el siguiente formato:

<método><SP><URI><SP><HTTP-Version><CRLF>

En la línea anterior, <SP> significa espacio en blanco y <CRLF>, salto de línea.

Estas solicitudes HTTP se envían empleando un método específico. El protocolo HTTP ofrece diferentes métodos de solicitud. Actualmente, la versión HTTP/1.1 define ocho métodos. Las denominaciones así como su descripción, se presentan en la siguiente tabla:

Métodos HTTP
Método Descripción
GET Obtiene cualquier tipo de información
HEAD Igual a GET pero el servidor no debe retornar una respuesta en el cuerpo del mensaje.
POST Mientras que GET se recupera mediante la URI, POST solicita al servidor aceptar la información encapsulada como una entidad dentro de la propia solicitud.
PUT Mientras que POST se limita a enviar la información encapsulada, PUT agrega a la solicitud, que la información enviada (encapsulada como en POST) sea almacenada en el recurso que se está solicitando. Si el recurso solicitado existe, HTTP interpreta que debe ser modificado con la nueva entidad recibida. Si no existe, podría crear la nueva entidad (siempre y cuando el recurso tenga la capacidad de hacerlo).
DELETE Solicita al servidor eliminar el recurso identificado en el URI.

Otros dos métodos son TRACE y CONNECT definidos en las secciones 9.8 y 9.9 de las RFC 2616, respectivamente.

Tras recibir la solicitud, y dependiendo tanto del método empleado por el cliente para efectuar la solicitud, como del resultado obtenido por el servidor al llevarla a cabo, este responderá al cliente con un mensaje compuesto de una línea de estado.

La línea de estado estará formada por la versión del protocolo, un código de estado de 3 dígitos, y su correspondiente explicación en una cadena de texto.

Existen cinco clases de respuesta que pueden ser identificadas por el primer número del código de estado. Las clases de respuesta se describen en la siguiente tabla:

Clases de respuestas HTTP
Clase Tipo Descripción
1xx Información la solicitud ha sido recibida y se continúa el proceso.
2xx Éxito la solicitud fue recibida y ejecutada con éxito
3xx Movida la solicitud requiere de acciones adicionales para ser completada
4xx Error de cliente la solicitud o bien estaba incompleta, o bien, contenía errores de formato
5xx Error de servidor la solicitud no pude completarse debido a un error del servidor

Las secciones 10.1 a 10.5 de las RFC 2616, definen la lista completa de los códigos de estado para las cinco clases de respuesta. Algunos de estos estados se describen en la siguiente tabla:

Estados HTTP
Código Descripción
200 Ok La solicitud ha sido exitosa
301 Moved Permanently El recurso solicitado ha sido movido de forma permanente y se le ha asignado un nuevo URI
304 Not Modified Cuando se realiza una nueva solicitud mediante el método GET y el recurso no ha sufrido cambios desde la última consulta del mismo cliente, el servidor debería responder con este código y no con ‘200 Ok’.
307 Temporary Redirect Redirección temporal a un nuevo recurso (con nuevo URI asignado, temporalmente)
400 Bad Request La solicitud no ha sido entendida por el servidor
403 Forbiden La solicitud ha sido rechazada por el servidor a pesar de haber sido entendida, y no debe ser reintentada
404 Not Found El servidor no encontró el recurso solicitado
405 Method Not Allowed El método de la solicitud no corresponde al método (o métodos) exigidos por el recurso
408 Request Time Out La solicitud del cliente ha tomado más tiempo del que el servidor puede esperar
500 Internal Server Error El servidor ha encontrado un problema interno y ha debido finalizar abruptamente la solicitud
503 Service Unavailable El servidor no se encuentra disponible temporalmente para manejar la solicitud
De esta forma, una API definirá no solo el recurso a través del cual será accedida, sino además, el método, y del método dependerá la respuesta. No obstante, si se va a consumir una API, se deberá tener en cuenta que una mala implementación del protocolo HTTP (o una mala interpretación del protocolo), pueden generar especificaciones incoherentes en la API, las cuales habrá que seguir a fin de no obtener fallos.

Generalmente, cuando se trate de leer datos de acceso público (como un listado de productos, o un catálogo de cualquier tipo que sea accesible por cualquier persona), el método del recurso será GET, y las posibles respuestas, serán:

...