Cliente de Requisição HTTP em Python – GET, POST

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 é combinado com o módulo urllib para lidar com conexões URL e interação com solicitações HTTP. Hoje vamos aprender como usar um cliente HTTP em Python para enviar solicitações HTTP e em seguida analisar o status da resposta e obter dados do corpo da resposta.

Cliente HTTP Python

Neste post sobre o módulo HTTP do Python, tentaremos fazer conexões e realizar solicitações HTTP como GET, POST e PUT. Vamos começar.

Realizando 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, nos conectamos ao URL na porta 80 com um tempo limite específico.

Python HTTP GET

Agora, vamos usar um 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 deste 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, já que 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 aos 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á bem, então deve ser algo com minha configuração. Depois de pesquisar um pouco, descobri que no MacOS, precisamos executar o arquivo Install Certificates.command presente no diretório de instalação do Python para resolver 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.

Python HTTP Client Ubuntu

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 também. 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 POSTar 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 do Python

Claro, também podemos realizar uma solicitação PUT usando o próprio módulo HTTP. Vamos usar o último programa mesmo. 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)

Vamos ver a saída para este programa:

Conclusão

Nesta lição, estudamos operações HTTP simples que podem ser feitas usando o http.client. Também podemos criar um servidor HTTP Python usando o módulo SimpleHTTPServer. Referência: API Doc

Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post