5.1 Introducción a HttpClient
En Python, como en muchos lenguajes de programación, hay un HttpClient estándar. En Python se llama http.client y permite ejecutar solicitudes HTTP de bajo nivel y trabajar con respuestas HTTP. Permite crear conexiones a servidores HTTP e interactuar con ellos.
Un módulo de bajo nivel, como http.client, ofrece un control más detallado sobre las operaciones HTTP, pero requiere más código para completar las tareas. A diferencia de este, los módulos de alto nivel, como requests, ofrecen una interfaz más sencilla, ocultando muchos detalles de implementación.
Principales características de http.client
El módulo http.client ofrece las siguientes principales características:
- Creación de conexiones HTTP.
- Envío de solicitudes HTTP.
- Lectura de respuestas HTTP.
- Manejo de encabezados y cuerpo de solicitudes y respuestas.
A diferencia del módulo requests, el módulo http.client es más de bajo nivel y presta mucha atención a los detalles del funcionamiento de la solicitud http.
Principales clases y métodos de http.client
| Clase/Método | Descripción |
|---|---|
HTTPConnection |
Creación de una conexión HTTP. |
HTTPSConnection |
Creación de una conexión HTTPS. |
request(method, url, ...) |
Envío de una solicitud HTTP. |
getresponse() |
Obtención de la respuesta a la solicitud. |
response.status |
Código de estado de la respuesta. |
response.reason |
Descripción textual del estado de la respuesta. |
response.read() |
Lectura de los datos de la respuesta. |
response.getheaders() |
Obtención de todos los encabezados de la respuesta. |
response.getheader(name) |
Obtención del valor de un encabezado específico. |
A continuación, examinaremos algunos de ellos con más detalle.
5.2 Ejecución de una GET-solicitud
Para realizar solicitudes utilizando la biblioteca http.client, es necesario seguir estos pasos:
Establecer conexión
Enviar solicitud
Obtener respuesta
Cerrar conexión
Es importante señalar que cerrar la conexión después de usarla es necesario para liberar recursos y prevenir pérdidas de memoria. Esto es especialmente importante al trabajar con una gran cantidad de solicitudes o en aplicaciones de larga duración.
Ejemplo de uso de HTTPConnection para una solicitud HTTP normal:
import http.client
# Creación de una conexión HTTP
conn = http.client.HTTPConnection("example.com")
# Envío de una solicitud GET
conn.request("GET", "/")
# Obtención de la respuesta
response = conn.getresponse()
print(response.status, response.reason)
# Cierre de la conexión
conn.close()
Ejemplo de uso de HTTPSConnection:
import http.client
# Creación de la conexión
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envío de una solicitud GET
conn.request("GET", "/posts/1")
# Obtención de la respuesta
response = conn.getresponse()
print(response.status, response.reason)
# Lectura y decodificación de los datos de la respuesta
data = response.read().decode('utf-8')
print(data)
# Obtención de todos los encabezados de la respuesta
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Cierre de la conexión
conn.close()
Un poco más extenso que al usar requests, ¿verdad?
5.3 Ejecución de una POST-solicitud
Una POST-solicitud utilizando http.client se realiza de manera muy similar a una GET-solicitud, solo que los datos deben empaquetarse manualmente en una cadena JSON, y también es necesario especificar el tipo de datos enviados — agregar un encabezado Content-Type.
Ejemplo:
import http.client
import json
# Envío de una POST-solicitud
conn.request("POST", "/posts", body=payload, headers=headers)
Como body es necesario pasar un objeto JSON serializado en una cadena, y como headers — un diccionario que contenga información sobre el tipo de datos.
Pueden verse, por ejemplo, así:
# Datos para enviar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Encabezados – tipo de contenido enviado
headers = {
'Content-Type': 'application/json'
}
Entonces el código completo de la POST-solicitud se verá así:
import http.client
import json
# Datos para enviar
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Encabezados
headers = {
'Content-Type': 'application/json'
}
# Creación de la conexión
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envío de la POST-solicitud
conn.request("POST", "/posts", body=payload, headers=headers)
# Obtención de la respuesta
response = conn.getresponse()
print(response.status, response.reason)
# Lectura y decodificación de los datos de la respuesta
data = response.read().decode('utf-8')
print(data)
# Cierre de la conexión
conn.close()
5.4 Manejo de errores al realizar solicitudes
También creo que será útil proporcionar un ejemplo de manejo de errores, ya que difiere del comportamiento de requests. En el módulo http.client, la excepción se lanza automáticamente si hay problemas con la conexión u otros errores HTTP.
Ejemplo:
import http.client
try:
# Creación de la conexión
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envío de la solicitud GET
conn.request("GET", "/posts/1")
# Obtención de la respuesta
response = conn.getresponse()
print(response.status, response.reason)
# Lectura y decodificación de los datos de la respuesta
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("Se produjo un error HTTP:", e)
except Exception as e:
print("Se produjo un error:", e)
finally:
# Cierre de la conexión
conn.close()
¿Qué puedo decir? Usar el módulo requests sería, por supuesto, más sencillo. ¡Pero! Muchos módulos y frameworks utilizan precisamente el http.client de bajo nivel bajo el capó. Necesitas saber cómo trabajar con él para poder configurar correctamente su funcionamiento.
GO TO FULL VERSION