
皆さん、こんにちは!今回は、PythonでWeb通信を行う際にぜひ注目していただきたいライブラリ、httpxをご紹介します。PythonのHTTPクライアントといえばrequestsライブラリが有名ですが、httpxはrequestsの使いやすさを引き継ぎつつ、現代のWebアプリケーション開発に求められる非同期処理やHTTP/2といった最新技術に標準で対応しています。
httpxとは?
httpxは、PythonでHTTPリクエストを送信するための高機能なクライアントライブラリです。requestsライブラリの優れたAPI設計を参考にしながら、同期処理と非同期処理の両方に統一されたインターフェースを提供している点が大きな特徴です。さらに、HTTP/2プロトコルにネイティブで対応しているため、より高速で効率的な通信を実現できます。
httpxの概要と主要機能
httpxは、次のような多様な機能を提供し、様々なシナリオでのHTTP通信をサポートします。
- 同期・非同期の両対応:
httpx.Clientを使った同期処理と、httpx.AsyncClientを使ったasync/awaitによる非同期処理のどちらも、Requestsライクな直感的なAPIで記述できます。 - HTTP/2のネイティブサポート: 追加の設定なしにHTTP/2での通信が可能です。これは、Webサイトの高速化に貢献します。
- 豊富なリクエストオプション: タイムアウト設定、リダイレクト処理、プロキシ設定、認証、クッキー管理など、HTTPリクエストに関する細かな設定が可能です。
- ストリーミング対応: 大容量のデータを扱う際に、レスポンスボディをチャンク単位で処理できます。
- 柔軟なエラーハンドリング: HTTPステータスコードに基づいたエラーチェックや、ネットワークエラーへの対応が容易です。
- テストのしやすさ: 仮想的なHTTPトランスポート(
httpx.MockTransportなど)を利用することで、ネットワークに依存しないユニットテストを記述できます。
Requestsライブラリに慣れている方なら、ほとんど違和感なく使えるはずですよ!学習コストが低いのは嬉しいポイントですね。
httpxを使うメリット
httpxをプロジェクトに導入するメリットは多岐にわたります。
- パフォーマンスの向上: 非同期処理を利用することで、複数のリクエストを並行して実行し、アプリケーションの応答性を高めることができます。また、HTTP/2によって、単一のTCPコネクションで複数のリクエスト・レスポンスを多重化できるため、特に多数の小さなリクエストを送信する際に効率的です。
- モダンなWeb技術への対応: HTTP/2への対応は、最新のWebサービスやAPIとの連携において非常に重要です。より効率的な通信プロトコルを利用することで、将来性のあるアプリケーションを構築できます。
- 開発効率の向上: Requestsライブラリに似たAPIであるため、既存のRequestsユーザーはスムーズに移行できます。同期と非同期でAPIが統一されているため、コードの可読性も保たれます。
- 堅牢なアプリケーション構築: 詳細なタイムアウト設定や、応答ステータスコードに基づいた自動的なエラー検出など、本番環境で安定稼働するアプリケーションを開発するための機能が充実しています。
サンプルコード
ここでは、httpxの基本的な使い方をいくつかご紹介します。
1. 同期GETリクエスト
import httpx
def get_sync_data(url: str):
print(f"同期GETリクエスト: {url}")
try:
response = httpx.get(url)
response.raise_for_status() # HTTPステータスコードが4xxまたは5xxの場合に例外を発生させる
print(f"ステータスコード: {response.status_code}")
print(f"レスポンスボディの一部: {response.text[:200]}...")
except httpx.RequestError as exc:
print(f"リクエスト中にエラーが発生しました: {exc}")
except httpx.HTTPStatusError as exc:
print(f"HTTPエラーが発生しました: {exc.response.status_code} - {exc.response.text}")
if __name__ == "__main__":
get_sync_data("https://www.google.com")2. 非同期GETリクエスト
import httpx
import asyncio
async def get_async_data(url: str):
print(f"非同期GETリクエスト: {url}")
async with httpx.AsyncClient() as client:
try:
response = await client.get(url)
response.raise_for_status()
print(f"ステータスコード: {response.status_code}")
print(f"レスポンスボディの一部: {response.text[:200]}...")
except httpx.RequestError as exc:
print(f"リクエスト中にエラーが発生しました: {exc}")
except httpx.HTTPStatusError as exc:
print(f"HTTPエラーが発生しました: {exc.response.status_code} - {exc.response.text}")
async def main():
await get_async_data("https://httpbin.org/get")
await get_async_data("https://www.python.org")
if __name__ == "__main__":
asyncio.run(main())高速化を狙うなら、ぜひ非同期処理にチャレンジしてみてくださいね!async/await構文を使えば、記述もスッキリしますよ。
3. 同期POSTリクエスト(JSONデータ送信)
import httpx
def post_json_data(url: str, data: dict):
print(f"同期POSTリクエスト: {url} へデータを送信")
try:
response = httpx.post(url, json=data)
response.raise_for_status()
print(f"ステータスコード: {response.status_code}")
print(f"レスポンス: {response.json()}")
except httpx.RequestError as exc:
print(f"リクエスト中にエラーが発生しました: {exc}")
except httpx.HTTPStatusError as exc:
print(f"HTTPエラーが発生しました: {exc.response.status_code} - {exc.response.text}")
if __name__ == "__main__":
post_json_data("https://httpbin.org/post", {"name": "Alice", "age": 30})みーちゃんのワンポイント
httpxを最大限に活用するコツは、同期・非同期のどちらの通信パターンにも対応できる柔軟性を理解し、プロジェクトの要件に合わせて使い分けることです。特にI/Oバウンドな処理が多い場合は、async/awaitを用いた非同期処理を積極的に導入することで、アプリケーションの性能を大きく向上させることができます。また、HTTP/2対応は意識せずとも恩恵を受けられますが、テストの際にはhttpx.MockTransportを活用し、外部依存を排除した堅牢なテストを書くことをお勧めします。

