FA-TOOLS — Header Component
آموزش httpx — جایگزین مدرن requests

آموزش httpx — جایگزین مدرن requests

✨ چکیده و نقشه راه این مقاله ✨

  • 🚀 چرا httpx؟ – نگاهی به مزایای فوق‌العاده این کتابخونه نسبت به requests.
  • 🛠️ نصب و راه‌اندازی – چجوری httpx رو تو پروژه‌ات فعال کنی.
  • 📝 کار باهاش چطوره؟ – آموزش گام به گام برای درخواست‌های GET, POST و بقیه.
  • ⚡ قدرت async/await – چطوری از سرعت بالای عملیات ناهمگام بهره ببری.
  • ⚙️ قابلیت‌های پیشرفته – از HTTP/2 بگیر تا مدیریت سشن‌ها و پروکسی‌ها.
  • 🆚 httpx در مقابل requests – مقایسه‌ای جامع تا انتخاب درستی داشته باشی.
  • ❓ عیب‌یابی سریع – پاسخ به مشکلات رایج و راه‌حل‌های عملی.

💡 برای دسترسی به کلی ابزار کاربردی و اسنیپت‌های پایتون و وب، حتماً یه سر به فروشگاه ابزارهای ما بزن! مطمئن باش کلی چیز بدرد بخور پیدا می‌کنی.

تماس: 09202232789

یادته یه زمانی همه برای درخواست‌های HTTP تو پایتون سراغ requests می‌رفتیم؟ خب، اون هنوزم یه کتابخونه عالی و پرطرفداره، ولی دنیای وب و برنامه‌نویسی هر روز در حال تغییر و پیشرفته. الان دیگه یه جایگزین مدرن‌تر و قدرتمندتر به اسم httpx اومده که اومده تا کارها رو برامون حسابی راحت‌تر کنه و سرعت رو ببره بالا. اگه می‌خوای پروژه‌هات رو به روز نگه داری و از قابلیت‌های جدید پایتون و وب نهایت استفاده رو ببری، پس حتماً باید httpx رو بشناسی. تو این مقاله قراره گام به گام با این رفیق جدیدمون آشنا بشیم و ببینیم چطور می‌تونه جریان کاری‌مون رو متحول کنه.

چرا httpx؟ مزایایی که نباید از دست بدی!

آموزش httpx — جایگزین مدرن requests — تصویر 2

قبل از اینکه بریم سراغ کدنویسی، بیا با هم یه نگاهی بندازیم به دلایلی که httpx اینقدر محبوبیتت پیدا کرده و چرا ممکنه انتخاب بهتری برای پروژه‌های جدیدت باشه:

  • پشتیبانی از Async/Await: این مهم‌ترین قابلیت httpx هست. اگه با برنامه‌نویسی ناهمگام (Asynchronous Programming) تو پایتون آشنا باشی، می‌دونی چقدر می‌تونه تو سرعت و کارایی اپلیکیشن‌های تحت وب یا اونایی که با APIهای زیادی سروکار دارن، تاثیرگذار باشه. httpx از پایه برای این مدل برنامه‌نویسی طراحی شده.
  • پشتیبانی از HTTP/2: این پروتکل جدیدتر نسبت به HTTP/1.1، سریع‌تر و بهینه‌تره. httpx به طور پیش‌فرض ازش پشتیبانی می‌کنه، در حالی که requests این قابلیت رو نداره و باید با ابزارهای جانبی اضافه بشه.
  • Clientهای دائمی: httpx بهت این امکان رو می‌ده که یک Client بسازی و ازش برای تمام درخواست‌هات استفاده کنی. این کار باعث میشه ارتباط‌ها (Connections) باز بمونن و دیگه لازم نباشه هر بار برای یه درخواست جدید، یه ارتباط جدید ایجاد بشه. نتیجه؟ سرعت بالاتر و مصرف منابع کمتر.
  • تنظیمات پیشرفته و قابل تنظیم: از مدیریت ریدایرکت‌ها و TimeOutها گرفته تا پروکسی‌ها و احراز هویت، همه چیز تو httpx قابل تنظیم و منعطفه.
  • استریمینگ و آپلود فایل: httpx با روش‌های بهتری برای استریم کردن داده‌ها و آپلود فایل‌ها ارائه شده که کنترل بیشتری بهت می‌ده.

نصب و راه‌اندازی httpx: شروع کار آسونه!

آموزش httpx — جایگزین مدرن requests — تصویر 3

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


pip install httpx

اگه می‌خوای از قابلیت‌های ناهمگامش (async) هم استفاده کنی، نیاز به یه کتابخونه دیگه به اسم h11 داری که معمولاً با نصب httpx خودش نصب میشه، ولی برای اطمینان می‌تونی صراحتاً نصبش کنی:


pip install httpx[http2] # برای پشتیبانی کامل از HTTP/2 و async

کار با httpx: قدم به قدم

حالا که httpx رو نصب کردی، بریم سراغ استفاده ازش. خیلی از متدهاش شبیه requests هستن، پس اگه قبلاً با requests کار کردی، خیلی زود باهاش ارتباط برقرار می‌کنی.

درخواست GET ساده

مثل requests، برای یه درخواست GET ساده فقط کافیه متد .get() رو صدا بزنی:


import httpx

response = httpx.get("https://httpbin.org/get")
print(response.status_code)
print(response.json())

ارسال پارامترها (Query Parameters)

برای ارسال پارامترها در URL، می‌تونی از دیکشنری params استفاده کنی:


import httpx

params = {"key1": "value1", "key2": "value2"}
response = httpx.get("https://httpbin.org/get", params=params)
print(response.json())

درخواست POST با داده‌های JSON

ارسال داده‌های JSON هم خیلی راحته. فقط کافیه از پارامتر json استفاده کنی:


import httpx

data = {"name": "Ali", "age": 30}
response = httpx.post("https://httpbin.org/post", json=data)
print(response.json())

ارسال هدرها (Headers)

اگه نیاز به ارسال هدرهای سفارشی داری، از دیکشنری headers استفاده کن:


import httpx

headers = {"User-Agent": "MyAwesomeApp/1.0", "Authorization": "Bearer YOUR_TOKEN"}
response = httpx.get("https://httpbin.org/headers", headers=headers)
print(response.json()['headers'])

💡

همیشه مطمئن شو که هدر Content-Type رو برای درخواست‌های POST یا PUT به درستی تنظیم می‌کنی، مخصوصاً وقتی داده‌های غیر JSON ارسال می‌کنی.

قدرت Async/Await با httpx: سرعت بی‌نظیر!

همونطور که گفتم، یکی از برگ برنده‌های httpx پشتیبانی از برنامه‌نویسی ناهمگامه. این یعنی می‌تونی چندین درخواست رو به صورت همزمان بفرستی بدون اینکه مجبور باشی منتظر بمونی تا یکی تموم بشه و بعد بری سراغ بعدی. این قابلیت برای اپلیکیشن‌های وب (مثل فریمورک‌هایی مثل FastAPI) یا اسکریپت‌هایی که نیاز دارن صدها درخواست رو با سرعت بالا بفرستن، فوق‌العاده کاربردیی هست.

مثال Async GET

برای استفاده از این قابلیت، باید AsyncClient رو ایمپورت کنی و از کلمات کلیدی async و await استفاده کنی.


import httpx
import asyncio

async def fetch_url(url):
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        print(f"URL: {url}, Status: {response.status_code}")
        return response.json()

async def main():
    urls = [
        "https://httpbin.org/get?delay=1",
        "https://httpbin.org/get?delay=2",
        "https://httpbin.org/get?delay=0.5"
    ]
    tasks = [fetch_url(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for res in results:
        print(f"Data: {res['args']}")

if __name__ == "__main__":
    asyncio.run(main())

در این مثال، سه درخواست GET به صورت همزمان ارسال می‌شن و نتیجه با سرعت بالاتری نسبت به حالت سنکرون دریافت میشه. این روش برای Scraperها و ربات‌هایی که نیاز به پردازش حجم بالای داده دارن، یه موهبته! اگه نیاز به اسنیپت‌های بیشتر پایتون داری، حتماً یه نگاهی به این بخش بنداز.

قابلیت‌های پیشرفته و کار با Client

یکی از بهترین الگوها در httpx، استفاده از Client هست. این کار بهت اجازه می‌ده که تنظیمات رو یک بار انجام بدی (مثل هدرها، بیس URL، تایم‌اوت‌ها) و بعد برای همه درخواست‌هایی که با اون Client می‌فرستی، از همون تنظیمات استفاده کنی.

استفاده از Client دائمی

با استفاده از httpx.Client()، می‌تونی یه کلاینت بسازی که ارتباطش رو حفظ می‌کنه. این کار برای عملکرد بهتر خیلی مهمه:


import httpx

with httpx.Client(base_url="https://api.example.com", headers={"X-Auth": "my-token"}) as client:
    response1 = client.get("/users/1")
    response2 = client.post("/posts", json={"title": "Hello"})
    print(response1.json())
    print(response2.json())

پروکسی‌ها و تایم‌اوت‌ها

مدیریت پروکسی و تایم‌اوت تو httpx خیلی سرراسته. کافیه تو تعریف Client این تنظیمات رو بهش بدی:


import httpx

proxies = {
    "http://": "http://localhost:8000",
    "https://": "http://localhost:8000",
}
timeout = 5.0 # 5 ثانیه

with httpx.Client(proxies=proxies, timeout=timeout) as client:
    try:
        response = client.get("https://httpbin.org/delay/10") # این درخواست timeout می‌خوره
        print(response.text)
    except httpx.TimeoutException:
        print("درخواست timeout خورد!")

ارسال فایل (File Upload)

برای ارسال فایل‌ها، می‌تونی از پارامتر files استفاده کنی.


import httpx

# یک فایل تستی ایجاد می‌کنیم
with open("test.txt", "w") as f:
    f.write("Hello, httpx!")

# فایل را برای ارسال باز می‌کنیم
with open("test.txt", "rb") as f_obj:
    files = {"upload_file": ("test.txt", f_obj, "text/plain")}
    response = httpx.post("https://httpbin.org/post", files=files)
    print(response.json()['files'])

httpx در مقابل requests: کدوم بهتره؟

اینجا یه مقایسه سریع داریم بین این دوتا کتابخونه تا بتونی تصمیم بگیری کدوم برای پروژه‌ات مناسب‌تره.

<!–

–>

<!–

–>

<!–

–>

<!–

–>

<!–

–>

<!–

–>

<!–

–>

ویژگی httpx requests
پشتیبانی از Async/Await ✅ بله (طراحی شده برای ناهمگام) ❌ خیر (فقط با کتابخانه‌های دیگر مثل `aiohttp`)
پشتیبانی از HTTP/2 ✅ بله (پیش‌فرض) ❌ خیر (نیاز به `requests-http2`)
استفاده از Client دائمی ✅ بله ( الگوی توصیه شده) ✅ بله (با `Session`ها)
نحوه کاربری بسیار شبیه به requests، با بهبودهای مدرن. ساده و شهودی، سال‌هاست که استاندارد است.
رفع مشکلات پیام‌های خطای واضح‌تر، ابزارهای دیباگینگ داخلی. گاهی اوقات نیازمند بررسی دقیق‌تر است.
حجم کتابخانه کمی سنگین‌تر به دلیل قابلیت‌های بیشتر. سبک و کم‌حجم.

خلاصه کلام اینکه، اگه پروژه‌ات نیاز به سرعت بالا، برنامه‌نویسی ناهمگام، و پشتیبانی از پروتکل‌های جدید مثل HTTP/2 داره، httpx بهترین انتخابه. اما اگه برای یه اسکریپت ساده یا یه پروژه کوچیک سنکرون نیاز به یه چیزی دم دستی و سریع داری، requests هنوز هم گزینه خوبی به حساب میاد. برای اینکه بتونی کدها رو بهتر مدیریت کنی، شاید نگاهی به کدهای آماده و اسنیپت‌های ما بی‌اندازی، اونجا کلی HTML، CSS، JS و حتی وردپرس پیدا می‌کنی.

عیب‌یابی سریع (Troubleshooting)

مثل هر کتابخونه دیگه، ممکنه موقع کار با httpx هم به مشکلاتی بخوری. اینجا چند تا از مشکلات رایج و راه‌حل‌هاشون رو با هم بررسی می‌کنیم:

❌ مشکل: TimeoutError در درخواست‌های ناهمگام

توضیح: این خطا معمولاً وقتی رخ میده که سرور مقصد، دیرتر از زمان تعیین شده در timeout، پاسخء می‌ده.

✅ راه‌حل:

  • افزایش زمان Timeout: مقدار timeout رو تو httpx.get()، httpx.post() یا تو تعریف Client افزایش بده. مثلاً timeout=10.0.
  • مدیریت خطا: همیشه درخواست‌هات رو داخل بلاک try-except httpx.TimeoutException قرار بده تا برنامه‌ات کرش نکنه.

❌ مشکل: خطای HTTP/2 Connection Error

توضیح: ممکنه با خطاهایی مثل ProtocolError یا مشکلات مربوط به TLS/SSL روبرو بشی که به خاطر تنظیمات HTTP/2 هست.

✅ راه‌حل:

  • نصب کامل: مطمئن شو که httpx رو با پشتیبانی HTTP/2 نصب کردی (pip install httpx[http2]).
  • بررسی URL: مطمئن شو که وبسایت مقصد واقعاً از HTTP/2 پشتیبانی می‌کنه. همه سایت‌ها این قابلیت رو ندارن.

❌ مشکل: عدم ارسال صحیح داده‌های POST (مثلاً فرم‌ها)

توضیح: گاهی اوقات داده‌ها اونطور که انتظار داری به رابط برنانه نویسی مقصد نمی‌رسن، مخصوصاً وقتی با فرم‌ها (application/x-www-form-urlencoded) سروکار داری.

✅ راه‌حل:

  • استفاده از data به جای json: برای ارسال فرم‌های استاندارد، از پارامتر data استفاده کن، نه json. httpx خودش هدر Content-Type رو به درستی تنظیم می‌کنه.
  • بررسی هدرها: با استفاده از response.request.headers می‌تونی هدرهای ارسالی رو چک کنی و مطمئن شی که Content-Type درسته.

امیدوارم این مقاله بهت کمک کرده باشه تا httpx رو بهتر بشناسی و از قدرت این جایگزین مدرن برای requests نهایت استفاده رو ببری. اگه سوالی یا مشکلی داشتی، حتماً تو بخش کامنت‌ها ازمون بپرس.

Table of Contents

آخرین نوشته‌ها