CodeGym /Cursos /Python SELF ES /Usando HttpClient

Usando HttpClient

Python SELF ES
Nivel 23 , Lección 4
Disponible

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.

1
Cuestionario/control
Serialización, nivel 23, lección 4
No disponible
Serialización
Serialización
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION