Python HTTPX . HTTP-клиент нового поколения для Python
В предыдущей статье мы рассмотрели замечательную библиотеку Requests для выполнения HTTP запросов. Но у данной библиотеки есть определенные недостатоки. Requests не поддерживает асинхронные HTTP-запросы. Также requests не поддерживает HTTP2 запросы. А в наше время это существенные ограничения.
В этой статье мы рассмотрим HTTPX - новую замечательную библиотеку на Python , который позволяет реализовывать синхронные и асинхронные HTTP-запросы, поддерживает HTTP1 и HTTP2 и благодаря этим возможностям он завоевал большую популярность в Python сообществе
Установим эту библиотеку используя pip
pip install httpx
Здесь мы устанавливаем базовые зависимости библиотеки httpx. При желании мы можем включить опциональные библиотеки для работы с HTTP/2(это мы сделаем ниже в этой статьет) или клиент командной строки , но для базового использования это не нужно.
Давайте выполним первый наш запрос используя библиотеку httpx. В качестве источника запроса выступит главная страница нашего блога.
import httpx
r = httpx.get('http://gadjimuradov.ru')
# Выводим статус ответа
print(r.status_code)
# Выводим заголовки
print(r.headers)
# Выводим ответ
print(r.text)
Если вы ранее использовали библиотеку Requests , то вы можете заметить , что API данной библиотеки очень похож на requests. Выше мы выполняем GET запрос. Также в похожем стиле выполняются и другие методы запросов POST, PUT, DELETE, HEAD и OPTIONS
import httpx
r_post = httpx.post('https://httpbin.org/post', data={'key': 'value'})
r_put = httpx.put('https://httpbin.org/put', data={'key': 'value'})
r_delete = httpx.delete('https://httpbin.org/delete')
r_ head= httpx.head('https://httpbin.org/get')
r_options = httpx.options('https://httpbin.org/get')
Если вы переходите из Requests , httpx.Client () - это то, что вы можете использовать вместо request.Session (). Про request.Session я писал в этой статье
Перехват исключений.
Когда вы будете писать код в производственной среде , то нам нужно будет обрабатывать исключения , которые могут возникать при выполнении запросов. Вдруг вызываемый сервер недоступен , или вы укажете неверный запрос или другие ошибки. Поэтому хорошей практикой является перехват и обработка исключений
Наиболее важными классами исключений в HTTPX являются RequestError и HTTPStatusError.
А базовым классом , от которого наследуются классы RequestError и HTTPStatusError является класс HTTPError.
Давайте перепишем наш код , который делает запрос к нашему блогу , используя перехват исключений. Это гарантирует нам , что наш код не упадет с исключением , потому что мы обрабатываем исключения. Это хорошая практика и вы должны придерживаться такого подходы при использовании библиотеки httpx или requests
try:
response = httpx.get("https://gadjimuradov.ru")
response.raise_for_status()
except httpx.RequestError as exc:
print(f"Произошла ошибка при запросе {exc.request.url!r}.")
except httpx.HTTPStatusError as exc:
print(f"Ошибочный код запроса {exc.response.status_code} при выполнени запроса {exc.request.url!r}.")
Поддержка асинхронных запросов
Одним из преимуществ по сравнению с библиотекой requests является то , что httpx позволяет нам делать асинхронные запросы.
import httpx
async with httpx.AsyncClient() as client:
r = await client.get(url)
Поддержка HTTP/2
HTTP/2 - это новая крупная версия протокола HTTP , которая обеспечивает нам большую производительность по сравнению с версией HTTP/1.1
Если HTTP/1.1 использовал текстовый формат , то HTTP/2 используется двоичный формат , которая обеспечиваетч полное мультиплексирование запросов и ответов, а также эффективное сжатие заголовков HTTP.
Мультиплексирование потоков означает, что там, где HTTP / 1.1 требует одного потока TCP для каждого параллельного запроса, HTTP / 2 позволяет одному потоку TCP обрабатывать несколько одновременных запросов.
При использовании httpx по умолчанию , то используется более проверенный и надежный протокол HTTP / 1.1.А поддержки по умолчанию HTTP / 2 в данный момент не предусмотрено. Но если мы хотим использовать HTTP/2 для отправки наших запросов , то мы можем установить httpx со связанной библиотекой , которая нам позволить выполнять запросы используя HTTP / 2
pip install httpx[http2]
Поддержка HTTP / 2 доступна как для клиента, так и для AsyncClient, хотя обычно она более полезна в асинхронных контекстах, если вы отправляете много одновременных запросов.
Включим поддержку HTTP / 2 при выполнении асинхронных запросов.
import httpx
async with httpx.AsyncClient(http2=True) as client:
r = await client.get(url)
Заключение
Я в своих проектах обычно использую библиотеку requests. И как вы заметили библиотека httpx имеет очень похожий API с requests, которая несомненно оказало на нее положительное влияние. Но httpx на данный момент имеет преимущество перед requests, тем что позволяет выполнять асинхронные запросы , наряду с синхронными. Ну и также поддержка HTTP / 2 .