Executando verificação de segurança...
2

[Python] Porque httpx em vez de requests?

Olá pessoal,

Sou desenvonvedor python com pouco tempo de experiência na área (menos de 2 anos).
Ataulmente trabalho realizando integrações e como lib para consumo de APIs venho usando requests.

Porém, tenho ouvido muito a respeito da lib httpx.
Que ela é uma boa alternativa ao requests..
Que ela é melhor que requests..

Mas as pessoas que eu ouvi falar sobre, não disseram o que seria melhor ou o motivo de uma e não a outra.

Alguém saberia me dizer? Concordam que httpx seja melhor?

Fiquem a vontade para discuir sobre.

Carregando publicação patrocinada...
3

A princípio, parecem ser similares para muitas funcionalidades, com uma ou outra diferença, conforme consta na documentação do HTTPX.

Se alguém te disse que é melhor, então deveria justificar, explicar os motivos. Senão é só uma opinião vazia, sem embasamento.

Procurei por alguns benchmarks para ver o que dizem. Esse aqui não encontrou diferença de desempenho significativa, e portanto não viu razão para mudar (vai continuar usando o requests).

Esse outro lista melhor as diferenças e semelhanças. Ele cita que o HTTPX possui melhor suporte à programação assíncrona (usando o módulo asyncio) e suporte a HTTP/2 (que o requests provavelmente não vai adicionar). Também são citadas semelhanças, inclusive a similaridade entre as API's (o que torna a transição mais fácil).

Dito isso, se está pensando em mudar, a melhor forma de avaliar é testando e vendo se há algum ganho para o seu caso específico.

1

Ser melhor ou não vai depender de pra que você ta usando um cliente HTTP. A maior vantagem é realmente a disponibilidade de um cliente assíncrono. Mas o que significa ser assíncrono?

Vc já deve ter visto async e await no mundo python. De forma geral, enquanto algo está sendo "awaitado" ou "esperado", o fluxo do programa pode continuar. No caso de um cliente HTTP, o assincronismo permite que vc emita as requests de forma assíncrona, ou seja, enquanto uma request aguarda a resposta do servidor, seu programa pode continuar fazendo outras coisas.

Se vc pensa em raspar uma API HTTP, por exemplo, a utilização de um cliente assíncrono vai acelerar muito o processo (claro, respeitando os limites impostos pelo servidor, como por exemplo limites de throttling).

Caso vc queira explorar raspagem de API HTTP com o httpx, recomendo utilizar em conjunto o aiometer, que é basicamente um limitador de concorrência.

Um pouco de número pra quem sabe te ajudar a entender:

Imagina um servidor que demora 1 segundo pra retornar uma resposta. Imagina que vc precisa fazer 10 requests pra esse servidor.

Com o requests, vc precisaria fazer as requests uma a uma, ou seja, algo como:

import requests

for _ in range(10):
    requests.get("servidor.com.br/api")

Com isso, temos que o programa acima leva 10 segundos pra ser finalizado, visto que cada requests.get irá parar a execução do programa por 1 segundo, e somente quando receber a resposta, irá passar para a próxima instrução.

O httpx te permite, à grosso modo, enviar as 10 requests ao mesmo tempo, de forma que todas as 10 requests sejam recebidas ao mesmo tempo, ou seja, apesar da resposta demorar 1 segundo, as 10 chegarão ao mesmo tempo. Com isso, o programa irá levar 1 segundo pra ser finalizado.

No readme do repositório do aiometer tem um exemplo de como implementar a situação acima.