El módulo HTTP de Python define las clases que proporcionan el lado del cliente de los protocolos HTTP y HTTPS. En la mayoría de los programas, el módulo HTTP no se utiliza directamente y se combina con el módulo urllib
para manejar conexiones URL e interactuar con solicitudes HTTP. Hoy aprenderemos cómo utilizar un cliente HTTP de Python para enviar solicitudes HTTP y luego analizar el estado de la respuesta y obtener datos del cuerpo de la respuesta.
Cliente HTTP de Python
En esta publicación sobre el módulo HTTP de Python, intentaremos realizar conexiones y hacer solicitudes HTTP como GET, POST y PUT. Comencemos.
Realizando Conexiones HTTP
Comenzaremos con lo más simple que el módulo HTTP puede hacer. Podemos realizar fácilmente conexiones HTTP utilizando este módulo. Aquí hay un programa de muestra:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Veamos la salida para este programa: En este script, nos conectamos a la URL en el puerto 80 con un tiempo de espera específico.
Python HTTP GET
Ahora, usaremos un cliente HTTP para obtener una respuesta y un estado de una URL. Echemos un vistazo a un fragmento de código:
import http.client
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
print("Status: {} and reason: {}".format(response.status, response.reason))
connection.close()
En el script anterior, utilizamos una URL y verificamos el estado con el objeto de conexión. Veamos la salida de este programa: Recuerda cerrar la conexión una vez que hayas terminado con el objeto de conexión. También, observa que utilizamos una
HTTPSConnection
para establecer la conexión, ya que el sitio web se sirve a través del protocolo HTTPS.
¿Obteniendo el error SSL: CERTIFICATE_VERIFY_FAILED?
Cuando ejecuté el programa anterior por primera vez, obtuve el siguiente error relacionado con los certificados SSL.
$ python3.6 http_client.py
Traceback (most recent call last):
File "http_client.py", line 4, in <module>
connection.request("GET", "/")
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
context=self, session=session)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)
$
A partir de la salida, estaba claro que tenía algo que ver con los certificados SSL. Pero el certificado del sitio web está bien, así que tiene que ser algo relacionado con mi configuración. Después de buscar un poco en Google, descubrí que en MacOS, necesitamos ejecutar el archivo Install Certificates.command
presente en el directorio de instalación de Python para solucionar este problema. La siguiente imagen muestra la salida producida por la ejecución de este comando, parece que está instalando los certificados más recientes para ser utilizados al realizar conexiones SSL. Ten en cuenta que obtuve este error en Mac OS. Sin embargo, en mi sistema Ubuntu, funcionó perfectamente bien.

Obteniendo la lista de encabezados de la respuesta
De la respuesta que recibimos, los encabezados generalmente también contienen información importante sobre el tipo de datos enviados desde el servidor y el estado de la respuesta también. Podemos obtener una lista de encabezados del objeto de respuesta en sí. Veamos un fragmento de código que es una versión ligeramente modificada del último programa:
import http.client
import pprint
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))
Veamos la salida de este programa:
Python HTTP POST
También podemos enviar datos POST a una URL con el módulo HTTP y obtener una respuesta de vuelta. Aquí hay un programa de ejemplo:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
Vamos a ver la salida de este programa: Siéntete libre de usar la biblioteca HTTP Bin para probar más solicitudes.
Solicitud PUT HTTP de Python
Por supuesto, también podemos realizar una solicitud PUT utilizando el propio módulo HTTP. Utilizaremos el último programa en sí mismo. Veamos un fragmento de código:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)
Veamos la salida de este programa:
Conclusión
En esta lección, estudiamos operaciones HTTP simples que se pueden realizar utilizando http.client
. También podemos crear un servidor HTTP en Python utilizando el módulo SimpleHTTPServer. Referencia: Documentación de la API
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post