import requests
O módulo HTTP do Python define as classes que fornecem o lado do cliente dos protocolos HTTP e HTTPS. Na maioria dos programas, o módulo HTTP não é usado diretamente e é agrupado com o módulo urllib
para lidar com conexões de URL e interação com solicitações HTTP. Hoje, aprenderemos como usar um cliente HTTP em Python para enviar solicitações HTTP e, em seguida, analisar o status da resposta e obter os dados do corpo da resposta.
Cliente HTTP Python
Neste post sobre o módulo HTTP do Python, tentaremos fazer conexões e solicitações HTTP como GET, POST e PUT. Vamos começar.
Fazendo Conexões HTTP
Vamos começar com a coisa mais simples que o módulo HTTP pode fazer. Podemos facilmente fazer conexões HTTP usando este módulo. Aqui está um programa de exemplo:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Vamos ver a saída para este programa: Neste script, conectamos à URL na porta 80 com um timeout específico.
Python HTTP GET
Agora, vamos usar o cliente HTTP para obter uma resposta e um status de uma URL. Vamos dar uma olhada em um trecho 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()
No script acima, usamos uma URL e verificamos o status com o objeto de conexão. Vamos ver a saída para este programa: Lembre-se de fechar uma conexão assim que terminar com o objeto de conexão. Além disso, observe que usamos um
HTTPSConnection
para estabelecer a conexão, pois o site é servido sobre o protocolo HTTPS.
Recebendo o erro SSL: CERTIFICATE_VERIFY_FAILED?
Quando executei o programa acima pela primeira vez, recebi o seguinte erro relacionado a 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)
$
Pela saída, ficou claro que tem algo a ver com os certificados SSL. Mas o certificado do site está ok, então tem que ser algo com minha configuração. Após algumas pesquisas, descobri que no MacOS, precisamos executar o arquivo Install Certificates.command
presente no diretório de instalação do Python para corrigir esse problema. A imagem abaixo mostra a saída produzida por esta execução de comando, parece que está instalando os certificados mais recentes para serem usados ao fazer conexões SSL. Note que recebi este erro no Mac OS. No entanto, no meu sistema Ubuntu, funcionou perfeitamente.

Obtendo a lista de cabeçalhos da resposta
A partir da resposta que recebemos, os cabeçalhos geralmente também contêm informações importantes sobre o tipo de dados enviados de volta pelo servidor e o status da resposta. Podemos obter uma lista de cabeçalhos do próprio objeto de resposta. Vamos dar uma olhada em um trecho de código que é uma versão um pouco modificada do ú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))
Vamos ver a saída para este programa:
Python HTTP POST
Também podemos enviar dados para uma URL com o módulo HTTP e obter uma resposta de volta. Aqui está um programa de exemplo:
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 ver a saída para este programa: Sinta-se à vontade para usar a biblioteca HTTP Bin para tentar mais requisições.
Requisição PUT HTTP em Python
Claro, podemos também realizar uma solicitação PUT usando o próprio módulo HTTP. Vamos usar o último programa. Vamos dar uma olhada em um trecho 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)
Veja a saída para este programa:
Conclusão
Nesta lição, estudamos operações simples de HTTP que podem ser feitas usando http.client
. Também podemos criar um servidor HTTP em Python usando o módulo SimpleHTTPServer. Referência: API Doc
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post