مقدمه
در این مقاله روشهای رایج ارسال درخواستهای POST با کتابخانه hrequests در Python را بهصورت عملی و با مثالهای کامل بررسی میکنیم. پس از خواندن این راهنما، شما میتوانید دادههای JSON و فرم را ارسال کنید، نوع محتوا را کنترل کنید، از Session برای ارسال درخواستهای متوالی استفاده کنید و نکات عملی درباره مدیریت خطا، تایماوت، امنیت و بهینهسازی را بهکار ببندید.
ارسال JSON با POST
رایجترین سناریو ارسال JSON به یک API است. hrequests پارامتر json را برای این منظور فراهم میکند که داده را بهصورت خودکار سریالایز کرده و هدر Content-Type را برابر با application/json قرار میدهد.
import hrequests
url = 'https://httpbin.org/post'
data = {'key': 'value'}
# ارسال POST با پارامتر json
response = hrequests.post(url, json=data)
# خروجی: پاسخ تبدیلشده به دیکشنری (اگر پاسخ JSON باشد)
print(response.json())
توضیح ورودی و خروجی:
- ورودی: url رشته مورد نظر و data یک دیکشنری Python.
- خروجی: یک شیء Response که متد json() آن پاسخ سرور را به دیکت تبدیل میکند.
شرح گامبهگام کد:
- ایمپورت کتابخانه hrequests.
- تعریف آدرس و دادهها.
- فراخوانی hrequests.post با پارامتر json که باعث میشود کتابخانه داده را به JSON تبدیل و هدر مناسب را تنظیم کند.
- چاپ پاسخ با response.json().
نکته: استفاده از پارامتر json معمولا ساده، امن و سریعتر از encode دستی است.
ارسال فرم (x-www-form-urlencoded)
برای ارسال دادههای فرم از پارامتر data استفاده میکنیم. در این حالت کتابخانه بهصورت پیشفرض هدر Content-Type را روی application/x-www-form-urlencoded قرار میدهد.
import hrequests
url = 'https://httpbin.org/post'
data = {'username': 'ali', 'password': 'secret'}
# ارسال داده فرم
response = hrequests.post(url, data=data)
# برای پاسخ متنی از text استفاده میکنیم
print(response.text)
وقتی داده را بهصورت فرم ارسال میکنید، سرور انتظار دارد فیلدها در بدنه با کدگذاری فرم فرستاده شوند. این روش برای فرمهای کلاسیک HTML یا endpointsی که فرم میپذیرند مناسب است.
تنظیم دستی Content-Type و ارسال JSON با data
گاهی لازم است نوع محتوا را خودتان کنترل کنید یا JSON را بهصورت رشتهای ارسال کنید. در این حالت باید داده را سریالایز کرده و هدر Content-Type را تنظیم کنید.
import hrequests
import json
url = 'https://httpbin.org/post'
data = {'key': 'value'}
# تبدیل داده به رشته JSON
json_data = json.dumps(data)
headers = {'Content-Type': 'application/json'}
response = hrequests.post(url, data=json_data, headers=headers)
print(response.json())
چرا این روش؟ ممکن است نیاز داشته باشید قالب دلخواهی ارسال کنید یا با APIهایی کار کنید که رفتار خاصی روی هدرها دارند. توجه داشته باشید که در این حالت مسئولیت سریالایز و ست کردن هدر با شماست.
استفاده از Session برای POSTهای متوالی
اگر با یک سرور چندین درخواست میفرستید و نیاز به نگهداری کوکی یا هدرهای مشترک دارید، از hrequests.Session() استفاده کنید تا اتصال (و وضعیت) مشترک بین درخواستها حفظ شود.
import hrequests
url = 'https://httpbin.org/post'
data = {'key': 'value'}
session = hrequests.Session()
# هدر مشترک برای تمامی درخواستهای این session
session.headers.update({'Content-Type': 'application/json'})
response = session.post(url, json=data)
print(response.json())
مزایا استفاده از سشن:
- نگهداری کوکیها بین درخواستها
- امکان استفاده از هدرها یا تنظیمات مشترک
- بهبود عملکرد با reuse کردن اتصال TCP
مدیریت خطا، تایماوت و retry
همیشه انتظار خطا داشته باشید: شبکه قطع میشود، سرور 5xx برمیگرداند یا پاسخ دیر میآید. پیشنهادهای عملی:
- همیشه از timeout استفاده کنید تا thread یا پردازش شما برای همیشه معلق نماند.
- کدهای وضعیت HTTP را بررسی کنید و بر اساس آن retry یا خطای مشخص برگردانید.
- برای retry از الگوریتمهای backoff مثل exponential backoff استفاده کنید.
import time
import hrequests
url = 'https://httpbin.org/post'
data = {'key': 'value'}
max_retries = 3
for attempt in range(1, max_retries + 1):
try:
# timeout به ثانیه
response = hrequests.post(url, json=data, timeout=5)
if response.status_code == 200:
print(response.json())
break
else:
print('status', response.status_code)
except Exception as e:
print('attempt', attempt, 'failed:', e)
time.sleep(2 ** attempt)
این نمونه یک retry ساده با افزایش زمان بین تلاشها نشان میدهد. برای پروژههای بزرگتر از کتابخانههایی مانند urllib3 یا راهحلهای اختصاصی برای retry استفاده کنید.
نکات امنیتی و بهترینروشها
مواردی که همیشه به یاد داشته باشید:
- از HTTPS استفاده کنید تا دادهها در transit رمزنگاری شوند.
- بهصورت پیشفرض تایید گواهینامه (certificate verification) را خاموش نکنید.
- اطلاعات حساس (مانند توکنها و رمزعبور) را در لاگها چاپ نکنید.
- در مواجهه با فرمها مراقب CSRF باشید؛ اگر API نیاز به توکن CSRF دارد، ابتدا توکن را از سرور دریافت کنید و سپس ارسال کنید.
عملکرد، استریم و ارسال فایل
برای بارهای بزرگ یا آپلود فایل از استریم استفاده کنید تا حافظه مصرفی بالا نرود. در hrequests معمولاً میتوانید با ارسال فایلها بهصورت فایل-آبجکت یا با تعیین پارامترهای مناسب، از ارسال chunked بهره ببرید.
# مثال آپلود فایل (الگوی کلی)
import hrequests
url = 'https://httpbin.org/post'
with open('large_file.bin', 'rb') as f:
files = {'file': f}
response = hrequests.post(url, files=files, timeout=30)
print(response.status_code)
برای دانلودهای بزرگ از پارامتر stream در پاسخ استفاده کنید و دادهها را chunk به chunk ذخیره کنید تا حافظه تمام نشود.
نکات عملی برای اسکریپینگ
- برای جلوگیری از بلاک شدن، از تاخیر بین درخواستها و روبوست بودن در برابر captchas و بلوکهای IP استفاده کنید.
- از هدر مناسب مانند User-Agent استفاده کنید و در صورت نیاز از پراکسیهای معتبر بهره ببرید.
- در صورت نیاز به مقیاس بالا، از مدیریت صف و محدودکننده نرخ (rate limiter) استفاده کنید.
جمعبندی
ارسال درخواست POST با hrequests در Python بسیار ساده است و پارامترهای json و data اغلب کار را راه میاندازند. برای سناریوهای پیشرفتهتر میتوانید هدرها را دستی تنظیم کنید، از Session برای نگهداری وضعیت استفاده کنید و حتماً مدیریت خطا، تایماوت و نکات امنیتی را بهکار ببرید. با ترکیب این تکنیکها میتوانید اسکریپتهای اسکریپینگ پایدار و مطمئن بسازید.





