خانه / آموزش‌ها / کار با درخواست‌های HTTP و کتابخانه Requests

کار با درخواست‌های HTTP و کتابخانه Requests

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

بسیاری از برنامه‌های پایتونی نیاز به ارتباط با اینترنت، دریافت اطلاعات از وب‌سایت‌ها یا ارسال داده به APIها دارند. در حالی که پایتون ماژول داخلی urllib را دارد، اما استاندارد طلایی و محبوب‌ترین روش برای این کار، استفاده از کتابخانه Requests است که شعار آن "HTTP for Humans" می‌باشد.

نصب و راه‌اندازی

از آنجایی که requests جزو کتابخانه‌های استاندارد (Built-in) پایتون نیست، ابتدا باید آن را نصب کنید. (اگر بخش python-pip-venv را مطالعه کرده باشید، با این دستور آشنا هستید).

python
# Static: Installation command
# در ترمینال یا خط فرمان اجرا کنید:
pip install requests

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

ساده‌ترین نوع ارتباط، دریافت اطلاعات از یک آدرس است. متد get() برای گرفتن داده استفاده می‌شود. شیء بازگردانده شده (Response)، حاوی تمام اطلاعات پاسخ سرور است.

python
# Static (External Library): Simple GET request
import requests

# ارسال درخواست به یک API نمونه
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')

# بررسی کد وضعیت (200 یعنی موفقیت‌آمیز)
if response.status_code == 200:
    print("Success!")
    # دسترسی به متن پاسخ
    print(response.text)
else:
    print("Failed")

کار با داده‌های JSON

اکثر APIهای مدرن پاسخ را به صورت JSON برمی‌گردانند. کتابخانه Requests متد داخلی .json() را دارد که مستقیماً پاسخ را به دیکشنری پایتون تبدیل می‌کند.

python
# Static (External Library): Handling JSON
import requests

response = requests.get('https://jsonplaceholder.typicode.com/users/1')

# تبدیل خودکار JSON به دیکشنری
data = response.json()

print(f"Name: {data['name']}")
print(f"Email: {data['email']}")

سطح پیشرفته (Professional Level)

در پروژه‌های واقعی، نیاز به ارسال پارامترها، تنظیم هدرهای امنیتی، مدیریت خطاها و بهینه‌سازی اتصالات دارید.

ارسال پارامترها و هدرها (Headers & Params)

برای جستجو یا فیلتر کردن در APIها معمولاً از Query String (بعد از علامت ? در URL) استفاده می‌شود. همچنین برای احراز هویت یا شبیه‌سازی مرورگر، باید headers را تنظیم کنید.

python
# Static (External Library): Advanced GET with headers
import requests

url = "https://jsonplaceholder.typicode.com/comments"

# پارامترهایی که به صورت ?postId=1 به URL اضافه می‌شوند
query_params = {
    "postId": 1
}

# هدرها برای شبیه‌سازی مرورگر یا ارسال توکن
headers = {
    "User-Agent": "MyPythonApp/1.0",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN" # مثال برای احراز هویت
}

response = requests.get(url, params=query_params, headers=headers)

print(f"URL Called: {response.url}")
# خروجی احتمالی: https://jsonplaceholder.typicode.com/comments?postId=1

متدهای POST و ارسال داده

برای ارسال اطلاعات به سرور (مانند ثبت‌نام کاربر یا آپلود فایل) از متد post() استفاده می‌شود.

  • استفاده از data=: برای فرم‌های معمولی (Form-Encoded).
  • استفاده از json=: برای APIهای مدرن (JSON Payload).
python
# Static (External Library): POST request
import requests

url = "https://jsonplaceholder.typicode.com/posts"

payload = {
    "title": "Home of Python",
    "body": "Learning Requests library",
    "userId": 1
}

# ارسال به صورت JSON
response = requests.post(url, json=payload)

# کد 201 معمولاً به معنای "ایجاد موفق" است
if response.status_code == 201:
    print("Created successfully:", response.json())

مدیریت خطاها و Timeouts

کدهای حرفه‌ای همیشه باید احتمال قطعی اینترنت یا کندی سرور را در نظر بگیرند. استفاده از timeout حیاتی است تا برنامه شما بی‌نهایت منتظر نماند. همچنین متد raise_for_status() بهترین راه برای مدیریت کدهای خطای HTTP (مثل 404 یا 500) است.

python
# Static (External Library): Robust Error Handling
import requests
from requests.exceptions import Timeout, RequestException

url = "https://jsonplaceholder.typicode.com/posts/1"

try:
    # timeout=5 یعنی اگر تا ۵ ثانیه جوابی نیامد، خطا بده
    response = requests.get(url, timeout=5)
    
    # اگر کد وضعیت 4xx یا 5xx باشد، خطا پرتاب می‌کند
    response.raise_for_status()
    
    data = response.json()
    print("Data received:", data['id'])

except Timeout:
    print("خطا: سرور در زمان مشخص شده پاسخ نداد.")
except RequestException as e:
    print(f"خطای کلی در ارتباط: {e}")

استفاده از Session (بهینه‌سازی Performance)

اگر قرار است چندین درخواست به یک سرور بفرستید (مثلاً لاگین کنید و سپس پروفایل را بگیرید)، استفاده از Session بسیار کارآمدتر است. این کار اتصال TCP را باز نگه می‌دارد و کوکی‌ها را خودکار مدیریت می‌کند.

python
# Static (External Library): Using Session
import requests

# ایجاد یک نشست (Session)
with requests.Session() as s:
    # تنظیم هدر یا کوکی مشترک برای تمام درخواست‌ها
    s.headers.update({'x-test': 'true'})
    
    # درخواست اول (Login فرضی)
    s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
    
    # درخواست دوم (Profile) - کوکی‌های درخواست قبل اینجا ارسال می‌شوند
    resp = s.get('https://httpbin.org/cookies')
    
    print(resp.json())