ویژگی تصویر

کتابخانه httpx در پایتون

  /  پایتون   /  کتابخانه httpx در پایتون
بنر تبلیغاتی الف

کتابخانه HTTPX یکی از ابزارهای مدرن و قدرتمند در پایتون برای ارسال درخواست‌های HTTP است که به عنوان نسخه‌ی پیشرفته‌تری از کتابخانه‌ی معروف requests شناخته می‌شود. این کتابخانه با پشتیبانی از قابلیت‌هایی مانند اتصال‌های ناهمزمان (asynchronous)، HTTP/2، streaming و timeout management به برنامه‌نویسان اجازه می‌دهد تا با بهره‌وری بالاتر و کنترل بیشتر با APIها و سرورهای وب تعامل کنند.

ویژگی‌های اصلی HTTPX

  • پشتیبانی کامل از async/await برای برنامه‌نویسی ناهمزمان
  • سازگاری کامل با API کتابخانه requests
  • پشتیبانی از HTTP/1.1 و HTTP/2
  • قابلیت streaming responses برای دریافت داده‌های بزرگ به‌صورت جریانی
  • مدیریت پیشرفته timeouts، retries و connection pooling
  • پشتیبانی از SSL/TLS verification

نصب کتابخانه HTTPX

برای نصب این کتابخانه می‌توانید از دستور زیر در محیط ترمینال استفاده کنید:

pip install httpx

این دستور آخرین نسخه‌ی پایدار HTTPX را نصب می‌کند. در صورتی که قصد استفاده از نسخه‌ی ناهمزمان را دارید، نیازی به نصب بسته‌ی جداگانه نیست؛ HTTPX هر دو حالت synchronous و asynchronous را پشتیبانی می‌کند.

ارسال درخواست ساده (GET Request)

اولین مثال ساده برای درک عملکرد HTTPX ارسال یک درخواست GET به یک API عمومی است:

import httpx

response = httpx.get("[https://api.github.com](https://api.github.com)")
print(response.status_code)
print(response.json()) 

در این مثال، تابع httpx.get() یک درخواست HTTP به آدرس مشخص‌شده ارسال می‌کند. خروجی response.status_code وضعیت پاسخ را نمایش می‌دهد (مثلاً 200 به معنی موفقیت)، و response.json() داده‌های JSON بازگشتی از سرور را برمی‌گرداند.

ارسال داده با متد POST

برای ارسال داده به سرور می‌توان از متد POST استفاده کرد:

import httpx

data = {"username": "matin", "password": "12345"}
response = httpx.post("[https://httpbin.org/post](https://httpbin.org/post)", data=data)
print(response.json()) 

در این مثال داده‌ها به‌صورت فرم (form data) ارسال می‌شوند. اگر بخواهیم داده‌ها را به‌صورت JSON ارسال کنیم، باید از پارامتر json استفاده کنیم:

response = httpx.post("https://httpbin.org/post", json=data)

این روش مناسب برای APIهای RESTful است که انتظار دریافت JSON دارند.

ارسال درخواست‌های ناهمزمان (Asynchronous Requests)

یکی از بزرگ‌ترین مزایای HTTPX، پشتیبانی از async/await است. در پروژه‌هایی که نیاز به ارسال چندین درخواست به‌صورت هم‌زمان دارند (مانند خزنده‌های وب یا APIهای سنگین)، استفاده از async باعث افزایش چشمگیر کارایی می‌شود:

import httpx
import asyncio

async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get("[https://api.github.com](https://api.github.com)")
print(response.status_code)
print(response.json())

asyncio.run(fetch_data()) 

در این کد از AsyncClient() استفاده شده است که برای مدیریت اتصال‌های ناهمزمان طراحی شده. تابع await منتظر پاسخ می‌ماند بدون آنکه کل برنامه را متوقف کند.

مدیریت Timeout و Retry

در درخواست‌های HTTP، ممکن است سرور پاسخ ندهد یا تأخیر داشته باشد. در چنین حالتی مدیریت timeout اهمیت زیادی دارد:

import httpx

try:
response = httpx.get("[https://httpbin.org/delay/5](https://httpbin.org/delay/5)", timeout=2.0)
except httpx.ReadTimeout:
print("درخواست بیش از حد طول کشید!") 

در این مثال، زمان انتظار (timeout) برابر با ۲ ثانیه تعیین شده است. چون آدرس مورد نظر با تأخیر پاسخ می‌دهد، یک خطای ReadTimeout رخ می‌دهد.

مدیریت Retry به صورت دستی

HTTPX به صورت داخلی Retry ندارد، اما می‌توان با حلقه و مدیریت خطا آن را پیاده‌سازی کرد:

import httpx, time

url = "[https://httpbin.org/status/503](https://httpbin.org/status/503)"
for attempt in range(3):
try:
response = httpx.get(url)
if response.status_code == 200:
print("موفق!")
break
except httpx.RequestError as e:
print(f"خطا در تلاش {attempt + 1}: {e}")
time.sleep(1) 

در این روش، در صورت بروز خطا، درخواست مجدداً ارسال می‌شود تا زمانی که پاسخ موفقیت‌آمیز دریافت گردد یا تعداد تلاش‌ها به پایان برسد.

ارسال Headerهای سفارشی

گاهی برای کار با APIها باید Headerهای خاصی (مانند کلید احراز هویت) ارسال کنیم:

headers = {"Authorization": "Bearer my_secret_token"}
response = httpx.get("https://api.example.com/data", headers=headers)
print(response.json())

در این مثال از Authorization برای ارسال توکن استفاده شده است. ارسال Headerها در HTTPX بسیار شبیه به کتابخانه requests است.

مدیریت Session و Connection Pooling

زمانی که چندین درخواست به یک سرور ارسال می‌شود، استفاده از Session باعث بهبود عملکرد و صرفه‌جویی در منابع می‌گردد:

with httpx.Client() as client:
    for i in range(3):
        response = client.get("https://httpbin.org/get")
        print(response.status_code)

در این روش، اتصال‌های تکراری به یک سرور بازنگه داشته می‌شوند که سرعت پاسخ‌دهی را افزایش می‌دهد. در حالت ناهمزمان نیز می‌توان از AsyncClient استفاده کرد.

پشتیبانی از Streaming

اگر داده‌های پاسخ بسیار بزرگ باشد (مثل دانلود فایل)، می‌توان از قابلیت streaming responses استفاده کرد:

with httpx.stream("GET", "https://example.com/largefile.zip") as r:
    for chunk in r.iter_bytes():
        print(f"Received {len(chunk)} bytes")

با استفاده از stream، داده‌ها به‌صورت بخش‌بخش (chunked) دریافت می‌شوند، که برای کار با فایل‌های حجیم بسیار مفید است.

مقایسه HTTPX با Requests

ویژگیHTTPXRequests
پشتیبانی از async✅ دارد❌ ندارد
HTTP/2✅ دارد❌ ندارد
Streaming✅ دارد✅ دارد
سازگاری با requests✅ بله✅ بله

بهترین روش‌ها (Best Practices)

  • همیشه از Client() یا AsyncClient() برای چندین درخواست به یک سرور استفاده کنید.
  • برای درخواست‌های زمان‌بر، مقدار timeout را مشخص کنید.
  • در پروژه‌های Async از await برای جلوگیری از بلاک شدن برنامه استفاده کنید.
  • در صورت نیاز به امنیت، گواهی SSL را بررسی کنید (verify=True).
  • در مواقعی که داده‌های زیاد ارسال یا دریافت می‌شوند از streaming استفاده کنید.

جمع‌بندی

کتابخانه HTTPX با فراهم کردن امکانات مدرن مانند پشتیبانی از async، HTTP/2، مدیریت timeout و session، یکی از بهترین انتخاب‌ها برای توسعه‌دهندگان پایتون در حوزه‌ی ارتباطات شبکه و API است. اگر پیش‌تر از کتابخانه‌ی requests استفاده کرده‌اید، مهاجرت به HTTPX بسیار آسان خواهد بود و امکانات بیشتری را در اختیار شما قرار می‌دهد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: