El módulo HTTP de Python define las clases que proporcionan el lado 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 urllibmódulo para gestionar las conexiones URL y la interacción con las solicitudes HTTP. Hoy aprenderemos a utilizar un cliente HTTP de Python para ejecutar una solicitud HTTP y luego analizar el estado de la respuesta y obtener los 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 solicitudes HTTP como GET, POST y PUT. Comencemos.
Establecimiento de conexiones HTTP
Comenzaremos con lo más sencillo que puede hacer el módulo HTTP. Podemos crear conexiones HTTP fácilmente utilizando este módulo. Aquí hay un programa de ejemplo:
import http.clientconnection = http.client.HTTPConnection('www.python.org', 80, timeout=10)print(connection)
Veamos el resultado de este programa: En este script, nos conectamos a la URL en el puerto 80 con un tiempo de espera específico.
Obtención HTTP de Python
Ahora, utilizaremos un cliente HTTP para obtener una respuesta y un estado de una URL. Veamos un fragmento de código:
import http.clientconnection = 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, usamos una URL y verificamos el estado con el objeto de conexión. Veamos el resultado de este programa: Recuerde cerrar una conexión una vez que haya terminado con el objeto de conexión. Además, observe que usamos un HTTPSConnectionpara establecer la conexión ya que el sitio web se sirve a través del protocolo HTTPS .
¿Obtienes el error SSL: CERTIFICATE_VERIFY_FAILED?
Cuando ejecuté por primera vez el programa anterior, 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 del resultado, quedó claro que tiene algo que ver con los certificados SSL. Pero el certificado del sitio web está bien, por lo que tiene que ser algo con mi configuración. Después de buscar en Google, descubrí que en MacOS, debemos ejecutar Install Certificates.commandel archivo presente en el directorio de instalación de Python para solucionar este problema. La siguiente imagen muestra el resultado producido por la ejecución de este comando, parece que está instalando los certificados más recientes que se utilizarán al realizar conexiones SSL. Tenga en cuenta que recibí este error en Mac OS. Sin embargo, en mi sistema Ubuntu, funcionó perfectamente bien.
Obtener la lista de encabezados de Response
A partir de la respuesta que recibimos, los encabezados también suelen contener información importante sobre el tipo de datos enviados desde el servidor y el estado de la respuesta. Podemos obtener una lista de encabezados del propio objeto de respuesta. Veamos un fragmento de código que es una versión ligeramente modificada del último programa:
import http.clientimport pprintconnection = 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 el resultado de este programa:
POST HTTP de Python
También podemos enviar datos a una URL mediante el módulo HTTP y obtener una respuesta. A continuación, se muestra un programa de ejemplo:
import http.clientimport jsonconn = 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())
Veamos el resultado de este programa: No dudes en utilizar la biblioteca HTTP Bin para probar más solicitudes.
Solicitud HTTP PUT de Python
Por supuesto, también podemos realizar una solicitud PUT utilizando el propio módulo HTTP. Utilizaremos el último programa en sí. Veamos un fragmento de código:
import http.clientimport jsonconn = 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 el resultado de este programa:
Conclusión
En esta lección, estudiamos operaciones HTTP simples que se pueden realizar con http.client. También podemos crear un servidor HTTP de Python con el módulo SimpleHTTPServer . Referencia: Documentación de API