FA-TOOLS — Header Component

کدهای آماده برای کار با REST API در پایتون

رفیق برنامه‌نویس! اگه سر و کارت با API زیاده و دنبال یه عالمه کد آماده و کاربردی برای کارهای روزمره با REST API توی پایتون هستی، جای درستی اومدی. اینجا قراره یه جعبه ابزار کامل از کدهای دم‌دست داشته باشیم که هر وقت لازم شد، فقط کپی کنی و با کمی تغییرات کوچیک، به کارت بیاد. از درخواست‌های ساده GET گرفته تا احراز هویت‌های پیچیده و هندل کردن خطاها، همه رو با هم می‌بینیم. راستی، اگه دنبال کدهای پایتون بیشتر برای پروژه‌هات هستی، حتما یه سری به بخش اسنیپت‌های پایتون ما بزن و از کلی ابزار و کد آماده دیدن کن. برای سوالات یا مشاوره هم می‌تونی همین الان با ما تماس بگیری: 09202232789

🗺️ نقشه راه سریع برای کدنویسی REST API با پایتون

کدهای آماده برای کار با REST API در پایتون — تصویر 1

تمام چیزی که برای شروع نیاز داری در یک نگاه!

📦 شروع کار

نصب requests، درک متدهای HTTP.

➡️ درخواست‌های GET

گرفتن داده، ارسال پارامترها.

➕ درخواست‌های POST

ارسال JSON و فرم دیتا.

🔐 احراز هویت

بیسیک، توکن، API Key.

🔄 هندل کردن پاسخ

وضعیت‌ها، JSON، خطاها.

Python Snippets

شروع کار: نصب و اولین درخواست

کدهای آماده برای کار با REST API در پایتون — تصویر 2

قبل از هر چیز، نیاز داریم تا کتابخانه requests رو نصب کنیم. این کتابخانه بهترین دوست ما برای کار با HTTP در پایتونه و کار رو خیلی راحت می‌کنه.

        pip install requests
    

حالا که نصب شد، بیاید یه درخواست GET ساده بزنیم. این متد برای “گرفتن” اطلاعات از سرور استفاده میشه و هیچ تغیری در داده‌های سرور ایجاد نمی‌کنه.

        import requests
        import json # برای نمایش بهتر JSON

        URL = "https://jsonplaceholder.typicode.com/todos/1"
        
        # ارسال درخواست GET
        response = requests.get(URL)

        # بررسی وضعیت پاسخ
        if response.status_code == 200:
            # گرفتن اطلاعات به صورت JSON
            data = response.json()
            print("داده‌های دریافتی:")
            print(json.dumps(data, indent=2, ensure_ascii=False))
        else:
            print(f"خطا در دریافت اطلاعات: {response.status_code}")
            print(f"متن خطا: {response.text}")
    

درخواست‌های GET: با پارامتر و هدر

کدهای آماده برای کار با REST API در پایتون — تصویر 3

اغلب اوقات، برای فیلتر کردن یا تعیین نوع داده‌ای که می‌خوایم از سرور بگیریم، نیاز به ارسال پارامتر (Query Parameters) داریم. همچنین، گاهی اوقات برای مشخص کردن نوع محتوا یا احراز هویت، هدرهایی رو به درخواست اضافه می‌کنیم.

ارسال پارامترها

فرض کنید می‌خواید لیست کارهای یک کاربر خاص رو از API بگیرید.

        import requests
        import json

        URL = "https://jsonplaceholder.typicode.com/todos"
        params = {
            "userId": 2,
            "_limit": 5 # برای محدود کردن نتایج
        }

        response = requests.get(URL, params=params)

        if response.status_code == 200:
            todos = response.json()
            print("کارهای کاربر شماره 2:")
            print(json.dumps(todos, indent=2, ensure_ascii=False))
        else:
            print(f"خطا: {response.status_code}")
    

ارسال هدرها

بعضی APIها نیاز به هدرهای خاصی دارن، مثلاً برای تعیین نوع محتوایی که قراره بفرستیم یا بگیریم (مثل `Accept` یا `Content-Type`).

        import requests
        import json

        URL = "https://api.github.com/users/octocat" # یک API واقعی برای مثال
        headers = {
            "Accept": "application/vnd.github.v3+json", # هدر خاص گیت‌هاب
            "User-Agent": "Python-Requests-Script"
        }

        response = requests.get(URL, headers=headers)

        if response.status_code == 200:
            user_info = response.json()
            print("اطلاعات کاربر GitHub:")
            print(json.dumps(user_info, indent=2, ensure_ascii=False))
        else:
            print(f"خطا: {response.status_code}")
    

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

وقتی می‌خوایم اطلاعات جدیدی به سرور بفرستیم، از متد POST استفاده می‌کنیم. این متد معمولاً برای ایجاد یک منبع جدید (مثلاً ساخت یک کاربر جدید یا ارسال یک پست) به کار میره.

ارسال داده به صورت JSON

رایج‌ترین فرمت برای ارسال داده به APIها JSON هست.

        import requests
        import json

        URL = "https://jsonplaceholder.typicode.com/posts"
        new_post_data = {
            "title": "عنوان تست از پایتون",
            "body": "این یک پست تستی است که با پایتون ساخته شده.",
            "userId": 1
        }

        # requests به صورت خودکار content-type را به application/json تنظیم می کند
        response = requests.post(URL, json=new_post_data)

        if response.status_code == 201: # 201 Created
            created_post = response.json()
            print("پست جدید با موفقیت ساخته شد:")
            print(json.dumps(created_post, indent=2, ensure_ascii=False))
        else:
            print(f"خطا در ساخت پست: {response.status_code}")
            print(f"متن خطا: {response.text}")
    

ارسال داده به صورت فرم (Form-Data)

گاهی اوقات نیاز داریم داده‌ها رو به صورت `application/x-www-form-urlencoded` یا `multipart/form-data` ارسال کنیم. مورد دوم بیشتر برای آپلود فایل کاربرد داره.

        import requests
        import json

        URL = "http://httpbin.org/post" # یک سرویس تستی برای مشاهده درخواست ها
        form_data = {
            "username": "python_dev",
            "password": "secure_password"
        }

        # ارسال داده به صورت فرم
        response = requests.post(URL, data=form_data)

        if response.status_code == 200:
            print("پاسخ سرور با Form-Data:")
            print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا: {response.status_code}")
    

احراز هویت (Authentication)

اکثر APIها برای دسترسی به منابع محافظت شده نیاز به احراز هویت دارن. اینجا چند روش رایج رو می‌بینیم.

احراز هویت پایه (Basic Auth)

این روش شامل ارسال نام کاربری و رمز عبور به صورت کد شده (base64) در هدر درخواست هست.

        import requests
        from requests.auth import HTTPBasicAuth
        import json

        URL = "http://httpbin.org/basic-auth/user/passwd"
        username = "user"
        password = "passwd"

        response = requests.get(URL, auth=HTTPBasicAuth(username, password))

        if response.status_code == 200:
            print("احراز هویت با موفقیت انجام شد:")
            print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا در احراز هویت: {response.status_code}")
            print(f"متن خطا: {response.text}")
    

احراز هویت با توکن (Bearer Token / API Key)

این روش رایج‌تر و امن‌تره. توکن یا کلید API رو در هدر `Authorization` با پیشوند `Bearer` یا مستقیماً در پارامترها ارسال می‌کنیم.

        import requests
        import json
        import os # برای گرفتن توکن از متغیرهای محیطی

        SECURE_API_URL = "https://some.secure.api.com/data" # یک URL فرضی
        API_TOKEN = os.getenv("MY_API_TOKEN", "YOUR_ACTUAL_TOKEN_HERE") # توکن رو از متغیر محیطی بگیر

        headers = {
            "Authorization": f"Bearer {API_TOKEN}",
            "Content-Type": "application/json"
        }

        # با توکن در هدر
        response_token = requests.get(SECURE_API_URL, headers=headers)
        if response_token.status_code == 200:
            print("داده‌های امن با توکن:")
            print(json.dumps(response_token.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا در دسترسی با توکن: {response_token.status_code}")

        # یا با API Key به عنوان پارامتر (کمتر رایج و امن)
        params_with_apikey = {
            "apiKey": API_TOKEN
        }
        response_apikey = requests.get(SECURE_API_URL, params=params_with_apikey)
        if response_apikey.status_code == 200:
            print("داده‌های امن با API Key در پارامتر:")
            print(json.dumps(response_apikey.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا در دسترسی با API Key: {response_apikey.status_code}")
    

مدیریت پاسخ‌ها و خطاها

وقتی درخواستی ارسال می‌کنیم، سرور پاسخی برمی‌گردونه که حاوی وضعیت درخواست و در صورت موفقیت، داده‌های مورد نظرمونه. مدیریت صحیح این پاسخ‌ها، به خصوص خطاها، برای Robust بودن برنامه حیاتیه.

کدهای وضعیت HTTP (HTTP Status Codes)

هر پاسخی از سرور با یک کد وضعیت عددی همراهه که نشون میده درخواست موفق بوده، خطا داشته یا نیاز به اقدام خاصی داره.

کد وضعیت معنی
200 OK درخواست موفق و پاسخ برگشت داده شده است.
201 Created منبع جدیدی با موفقیت ایجاد شده است (معمولاً پس از POST).
204 No Content درخواست موفق، اما هیچ محتوایی برای ارسال در پاسخ وجود ندارد.
400 Bad Request درخواست ارسال شده از سمت کلاینت اشتباه بوده است.
401 Unauthorized کلاینت اجازه دسترسی به منبع را ندارد (احراز هویت انجام نشده یا اشتباه است).
403 Forbidden کلاینت احراز هویت شده، اما اجازه دسترسی به منبع خاص را ندارد.
404 Not Found منبع درخواستی در سرور پیدا نشد.
500 Internal Server Error خطایی سمت سرور رخ داده است.

بررسی خودکار خطاها

کتابخانه `requests` یک متد مفید به نام `raise_for_status()` داره که اگه کد وضعیت پاسخ نشون دهنده خطا باشه (مثلاً 4xx یا 5xx)، یک استثنا (Exception) ایجاد می‌کنه. این باعث میشه کدتون تمیزتر باشه و مجبور نباشید هر بار `if response.status_code != 200:` رو بنویسید.

        import requests

        URL_SUCCESS = "https://jsonplaceholder.typicode.com/todos/1"
        URL_NOT_FOUND = "https://jsonplaceholder.typicode.com/todos/999999"

        try:
            response_ok = requests.get(URL_SUCCESS)
            response_ok.raise_for_status() # اگه خطا باشه، استثنا ایجاد میشه
            print("درخواست موفق بود.")
            print(response_ok.json())
        except requests.exceptions.HTTPError as err:
            print(f"خطای HTTP در درخواست موفق: {err}")
        except requests.exceptions.ConnectionError as err:
            print(f"خطای اتصال در درخواست موفق: {err}")

        print("n--- امتحان کردن یک URL با خطا ---")

        try:
            response_error = requests.get(URL_NOT_FOUND)
            response_error.raise_for_status()
            print("درخواست خطا موفق بود (نباید اینو ببینیم!).")
        except requests.exceptions.HTTPError as err:
            print(f"خطای HTTP: {err}")
            print(f"کد وضعیت: {err.response.status_code}")
            print(f"متن پاسخ: {err.response.text}")
        except requests.exceptions.RequestException as err:
            print(f"خطای نامشخص در درخواست: {err}")
    

متدهای HTTP دیگر (PUT, DELETE, PATCH)

غیر از GET و POST، متدهای دیگه ای هم برای تعامل با منابع REST API وجود دارن که بهشون متدهای CRUD (Create, Read, Update, Delete) میگن.

PUT: به‌روزرسانی کامل یک منبع

متد PUT برای به‌روزرسانی (جایگزینی کامل) یک منبع موجود استفاده میشه.

        import requests
        import json

        URL = "https://jsonplaceholder.typicode.com/posts/1"
        updated_data = {
            "id": 1,
            "title": "عنوان جدید به روزرسانی شده",
            "body": "محتوای جدید برای پست شماره یک.",
            "userId": 1
        }

        response = requests.put(URL, json=updated_data)

        if response.status_code == 200:
            print("پست با موفقیت به روز شد (PUT):")
            print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا در به روزرسانی (PUT): {response.status_code}")
    

PATCH: به‌روزرسانی جزئی یک منبع

متد PATCH برای اعمال تغییرات جزئی به یک منبع موجود استفاده میشه. بر خلاف PUT که کل منبع رو جایگزین می‌کنه، PATCH فقط فیلدهای مشخص شده رو تغییر میده.

        import requests
        import json

        URL = "https://jsonplaceholder.typicode.com/posts/1"
        partial_update_data = {
            "title": "فقط عنوان به روز شد"
        }

        response = requests.patch(URL, json=partial_update_data)

        if response.status_code == 200:
            print("پست با موفقیت به روز شد (PATCH):")
            print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        else:
            print(f"خطا در به روزرسانی جزئی (PATCH): {response.status_code}")
    

DELETE: حذف یک منبع

متد DELETE برای حذف یک منبع از سرور به کار میره.

        import requests

        URL = "https://jsonplaceholder.typicode.com/posts/1" # برای تست این پست حذف می شود

        response = requests.delete(URL)

        if response.status_code == 200: # یا 204 No Content
            print("پست با موفقیت حذف شد.")
        else:
            print(f"خطا در حذف پست: {response.status_code}")
            print(f"متن خطا: {response.text}")
    

امکانات پیشرفته‌تر با `requests`

`requests` فقط برای درخواست‌های ساده نیست. امکانات قوی‌تری هم داره که می‌تونه کار رو خیلی راحت‌تر و کارآمدتر کنه.

استفاده از Sessions برای persistent connections

وقتی چندین درخواست به یک هاست می‌فرستید، استفاده از `Session` باعث میشه کوکی‌ها و هدرها بین درخواست‌ها حفظ بشن و سرعت هم بهتر بشه، چون connection باز می‌مونه.

        import requests

        # ساخت یک شی Session
        with requests.Session() as session:
            # تنظیم یک هدر پیش‌فرض برای تمام درخواست‌های این سشن
            session.headers.update({"User-Agent": "My-Custom-App/1.0"})

            # درخواست اول (کوکی تنظیم می‌شود)
            response1 = session.get("http://httpbin.org/cookies/set/sessioncookie/12345")
            print(f"پاسخ سشن 1 (تنظیم کوکی): {response1.status_code}")

            # درخواست دوم (کوکی ارسال می‌شود)
            response2 = session.get("http://httpbin.org/cookies")
            print("کوکی‌های ارسالی در درخواست دوم:")
            print(response2.json())
            assert response2.json()["cookies"]["sessioncookie"] == "12345"
    

آپلود فایل

آپلود فایل با `requests` خیلی ساده‌ست. از پارامتر `files` استفاده می‌کنیم.

        import requests
        import json
        from io import StringIO

        URL = "http://httpbin.org/post"

        # فرض کنید یک فایل متنی داریم
        file_content = "این محتوای فایل تستی است.nخط دوم فایل."
        dummy_file = StringIO(file_content)

        files = {"upload_file": ("my_test_file.txt", dummy_file, "text/plain")}

        response = requests.post(URL, files=files)

        if response.status_code == 200:
            print("فایل با موفقیت آپلود شد:")
            response_json = response.json()
            print(json.dumps(response_json, indent=2, ensure_ascii=False))
            print(f"نام فایل دریافتی: {response_json['files']['upload_file']}")
        else:
            print(f"خطا در آپلود فایل: {response.status_code}")
    

برای آپلود فایل‌های واقعی، می‌تونید از `open(‘path/to/file.txt’, ‘rb’)` استفاده کنید.

Timeouts

تنظیم `timeout` برای درخواست‌ها خیلی مهمه تا اگه سرور دیر پاسخ داد، برنامه شما برای همیشه منتظر نمونه و هنگ نکنه.

        import requests

        URL_SLOW = "http://httpbin.org/delay/5" # این URL 5 ثانیه تاخیر داره

        try:
            # 2 ثانیه برای اتصال، 5 ثانیه برای دریافت پاسخ
            response = requests.get(URL_SLOW, timeout=(2, 3)) # 3 ثانیه برای پاسخ، پس باید timeout بخوره
            print("درخواست با موفقیت انجام شد.")
        except requests.exceptions.Timeout as err:
            print(f"درخواست به دلیل Timeout ناموفق بود: {err}")
        except requests.exceptions.RequestException as err:
            print(f"خطای کلی در درخواست: {err}")
    

آپلود فایل

اگه شما در کار با اسنیپت‌های HTML یا کدهای CSS هم تجربه دارید، احتمالا می‌دونید که فرم‌های وب چطور کار می‌کنند. اینجا روش آپلود فایل با `requests` رو می‌بینیم.

        import requests
        import json

        upload_url = "http://httpbin.org/post" # یک سرور تستی برای آپلود فایل

        # ساخت یک فایل ساختگی برای مثال
        with open("temp_upload_file.txt", "w", encoding="utf-8") as f:
            f.write("این یک فایل برای تست آپلود است.nمحتوای آزمایشی.")

        try:
            with open("temp_upload_file.txt", "rb") as f:
                files = {"my_file": f}
                data_fields = {"description": "توضیحات فایل", "category": "docs"}
                response = requests.post(upload_url, files=files, data=data_fields)

            response.raise_for_status()
            print("فایل با موفقیت آپلود شد!")
            print(json.dumps(response.json(), indent=2, ensure_ascii=False))
        except Exception as e:
            print(f"خطا در آپلود فایل: {e}")
        finally:
            os.remove("temp_upload_file.txt") # حذف فایل موقتی
    

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

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

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

🛠️ مشکلات رایج و راه حل‌ها

  • HTTPError: 401 Unauthorized یا 403 Forbidden

    مشکل: دسترسی به API رد شده.
    راه حل:

    1. توکن یا API Key رو دوباره چک کن. مطمئن شو که تاریخ انقضا نداشته باشه یا درست کپی شده باشه.
    2. مطمئن شو که توکن/کلید رو توی هدر Authorization با فرمت صحیح (مثلاً Bearer YOUR_TOKEN) می‌فرستی.
    3. امتیازهای دسترسی (permissions) توکن رو بررسی کن. شاید توکن شما اجازه دسترسی به اون منبع خاص رو نداره.
  • HTTPError: 400 Bad Request

    مشکل: داده‌های ارسالی شما مشکل داره.
    راه حل:

    1. ساختار JSON رو دوبار چک کن. آیا همه فیلدهای اجباری هستن؟ آیا نوع داده‌ها (رشته، عدد، بولین) درسته؟
    2. هدر Content-Type رو بررسی کن. اگه JSON می‌فرستی، باید application/json باشه. requests معمولاً خودش اینو تنظیم می‌کنه ولی گاهی ممکنه لازم باشه دستی ستش کنی.
    3. متن خطا (response.text یا response.json()) رو بخون. معمولاً API پیام‌های خطای مفیدی برمی‌گردونه.
  • ConnectionError: Max retries exceeded with url…

    مشکل: برنامه نتونسته به سرور API وصل بشه.
    راه حل:

    1. اول از همه، آدرس URL رو چک کن که درست باشه. تایپو (غلط املایی) رایجه!
    2. اینترنت خودت رو بررسی کن.
    3. مطمئن شو که سرور API بالا باشه و مشکلی نداشته باشه.
    4. اگه پشت فایروال یا پروکسی هستی، تنظیمات مربوط به پروکسی رو توی requests انجام بده.
  • Timeout: The read operation timed out

    مشکل: سرور در زمان مشخص شده پاسخ نداد.
    راه حل:

    1. مقدار timeout رو افزایش بده (timeout=10 یا بیشتر).
    2. عملکرد سرور API رو بررسی کن. شاید سرور کند شده یا تحت بار زیاده.

کلام آخر

خب رفیق، این تمام چیزی بود که برای شروع و پیشرفت توی کار با REST API در پایتون با کتابخونه `requests` نیاز داری. از درخواست‌های ساده GET و POST گرفته تا احراز هویت‌های مختلف و هندل کردن خطاها، سعی کردیم جامع و کاربردی پوشش بدیم. این کدها مثل یه نقشه راه می‌مونن که می‌تونی توی پروژه‌های مختلف ازشون کمک بگیری. یادت باشه، تمرین و امتحان کردن با APIهای مختلف، بهترین راه برای مسلط شدن به این مباحثه.

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

Table of Contents

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