Python HTTPX . HTTP-клиент нового поколения для Python

08 Май 2021 , 8786

В предыдущей статье мы рассмотрели замечательную библиотеку 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 .

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги