Cliente de Solicitação HTTP 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 é 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.

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. 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