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:
- un cliente que consume los recursos provistos por un servidor;
- y un servidor, que provee de recursos a los clientes.
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é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:
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:
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:
...