Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 12

الطلبات في بايثون: GET و POST باستخدام Requests

Recommended resources

أهلاً بك مرة أخرى!

في الدرس السابق، قمنا ببناء الأساس النظري لفهم كيفية تواصل البرامج عبر الإنترنت. تعلمنا عن واجهات برمجة التطبيقات (APIs) باستخدام تشبيه "النادل"، وفهمنا أن بروتوكول HTTP هو "اللغة" التي يستخدمها هذا النادل، والتي تتكون من دورة الطلب والاستجابة (Request-Response).

اليوم، سننتقل من عالم النظرية إلى عالم التطبيق العملي. سنكتب معاً أول أسطر برمجية تتواصل مع الإنترنت. هدفنا هو تحقيق ما يلي:

  • إرسال طلب GET لجلب بيانات من خادم بعيد.
  • إرسال طلب POST لإرسال بيانات لإنشاء مورد جديد على الخادم.

سنستخدم في ذلك أداة قوية وبسيطة في بايثون تسمى مكتبة requests. بنهاية هذا الدرس، ستكون قد حولت المفاهيم المجردة التي تعلمناها إلى مهارة عملية، وهي خطوة هائلة نحو بناء وكيل الذكاء الاصطناعي الخاص بك.


1. أداتك للتواصل: مكتبة requests

لكي يتمكن برنامج بايثون من إرسال واستقبال طلبات HTTP، نحن بحاجة إلى أداة متخصصة. لحسن الحظ، توجد مكتبة رائعة وشائعة جداً تسمى requests. شعارها هو "HTTP للبشر" (HTTP for Humans)، لأنها تجعل عملية التواصل مع الـ APIs بسيطة ومقروءة للغاية.

بما أن requests ليست جزءاً من مكتبة بايثون القياسية، يجب علينا تثبيتها أولاً. افتح الطرفية (Terminal أو Command Prompt) واكتب الأمر التالي:

pip install requests

بعد اكتمال التثبيت، يمكنك استخدامها في أي برنامج بايثون عن طريق استيرادها في بداية الملف، هكذا:

import requests
Python Requests Library: GET Request Example
شعار مكتبة requests الشهيرة، وبجانبه مثال بسيط يوضح سهولة استخدامها لإرسال طلب GET.


2. جلب البيانات: إرسال طلب GET

لنتذكر: طلب GET يشبه قولك للنادل: "أحضر لي الطبق رقم 1 من القائمة". أنت تطلب معلومات موجودة بالفعل.

سنستخدم واجهة برمجية وهمية ومجانية تُدعى JSONPlaceholder. هي ممتازة للتدريب لأنها لا تتطلب مفاتيح خاصة وتتصرف كـ API حقيقي.

لنجرب جلب "منشور" (post) له المعرّف (id) رقم 1:

import requests

# 1. تحديد عنوان الـ API الذي نريد جلب البيانات منه
url = "https://jsonplaceholder.typicode.com/posts/1"

# 2. إرسال طلب GET إلى العنوان المحدد وتخزين الاستجابة في متغير
response = requests.get(url)

# 3. فحص الاستجابة
print(f"رمز الحالة (Status Code): {response.status_code}")
print("---")
print("البيانات المستلمة (JSON):")
print(response.json())

شرح الكود خطوة بخطوة:

  1. url = "...": أنشأنا متغيراً نصياً يحتوي على الرابط الكامل للبيانات التي نريدها. لاحظ أن /posts/1 هي نقطة النهاية (Endpoint) التي تحدد بالضبط ما نريده: المنشور رقم 1.
  2. response = requests.get(url): هذا هو السطر السحري! هنا نستخدم دالة get من مكتبة requests لإرسال الطلب. البرنامج سيتوقف مؤقتاً هنا، يرسل الطلب عبر الإنترنت، ينتظر رد الخادم، ثم يخزن كل معلومات الرد في المتغير response.
  3. response.status_code: كما تعلمنا في الدرس الماضي، لكل استجابة رمز حالة. نحن نطبعه هنا. إذا رأيت 200، فهذا يعني "OK" (نجاح).
  4. response.json(): هذه الدالة المساعدة في كائن الاستجابة تقوم بعمل رائع: تأخذ النص القادم من الخادم (الذي يكون بتنسيق JSON) وتحوله مباشرة إلى قاموس بايثون (Dictionary)، وهو نوع البيانات الذي تدربنا عليه بالفعل!

عند تشغيل هذا الكود، ستكون المخرجات شبيهة بالتالي:

رمز الحالة (Status Code): 200
---
البيانات المستلمة (JSON):
{'userId': 1, 'id': 1, 'title': 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', 'body': 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto'}

لقد نجحت! برنامجك تحدث مع خادم على الإنترنت، طلب منه بيانات، استلمها، وفهمها.



3. إنشاء بيانات: إرسال طلب POST

الآن، لنجرب السيناريو الآخر. طلب POST يشبه إعطاء النادل ورقة تحتوي على مكونات ساندويتش مخصص وقول: "اصنع لي هذا". أنت ترسل بيانات لإنشاء شيء جديد.

سنرسل بيانات لإنشاء منشور جديد.

import requests

# 1. تحديد عنوان الـ API الذي سنرسل إليه البيانات
url = "https://jsonplaceholder.typicode.com/posts"

# 2. تجهيز البيانات التي نريد إرسالها في شكل قاموس بايثون
new_post_data = {
    "title": "My First Post",
    "body": "This is very exciting! I am talking to an API.",
    "userId": 1
}

# 3. إرسال طلب POST مع إرفاق بياناتنا
response = requests.post(url, json=new_post_data)

# 4. فحص الاستجابة
print(f"رمز الحالة (Status Code): {response.status_code}")
print("---")
print("البيانات التي أرجعها الخادم بعد الإنشاء:")
print(response.json())

ما الذي تغير هنا؟

  1. url: لاحظ أننا حذفنا /1 من نهاية الرابط. نحن نرسل إلى "مجموعة المنشورات" (/posts) لنطلب منها إنشاء منشور جديد، بدلاً من التحدث إلى منشور معين.
  2. new_post_data: أنشأنا قاموساً يحتوي على كل المعلومات التي يتطلبها الـ API لإنشاء منشور جديد.
  3. requests.post(url, json=new_post_data): استخدمنا دالة post بدلاً من get. الأهم هو الوسيط الثاني json=new_post_data. هذا يخبر مكتبة requests بأن تأخذ قاموس بايثون الخاص بنا، تحوله إلى تنسيق JSON، وتضعه في متن (Body) الطلب.
  4. response.status_code: عند تشغيل الكود، ستلاحظ على الأغلب أن رمز الحالة هو 201. هذا الرمز يعني "Created" (تم الإنشاء بنجاح)، وهو رد نموذجي لطلبات POST الناجحة.

المخرجات المتوقعة:

رمز الحالة (Status Code): 201
---
البيانات التي أرجعها الخادم بعد الإنشاء:
{'title': 'My First Post', 'body': 'This is very exciting! I am talking to an API.', 'userId': 1, 'id': 101}

لاحظ كيف أن الخادم استقبل بياناتنا وأعادها لنا مع إضافة id جديد (101) للمنشور الذي تم إنشاؤه.


شاهد وتعلم

الآن بعد أن رأيت الكود، قد يكون من المفيد مشاهدة شخص يطبق هذه الخطوات عملياً.

(REST API)Lesson 60 Using HTTP Methods for RESTful Services إستخدام API مع GET , POST و PUT و PATCH

يقدم هذا الفيديو من "قناة مستر ماجد التعليمية" تطبيقاً عملياً لكل ما تعلمناه الآن. سيريك كيف تكتب كوداً لإرسال طلبات GET و POST باستخدام مكتبة requests.

شاهد المقاطع التالية من الفيديو لترسيخ فهمك: طلب GET (من 00:47 إلى 03:52): ركز على كيفية استخدام requests.get()، وكيفية فحص status_code، وكيفية عرض البيانات المستلمة. طلب POST (من 03:52 إلى 06:52): انتبه جيداً لكيفية إنشاء القاموس الذي يحتوي على البيانات، وكيفية إرساله باستخدام requests.post()، ولاحظ رمز الحالة 201 الذي يظهر عند النجاح.

اختبر فهمك!

توفر واجهة JSONPlaceholder أيضاً نقطة نهاية للتعامل مع "التعليقات" (comments) على الرابط https://jsonplaceholder.typicode.com/comments.

  1. كيف يمكنك تعديل كود طلب GET الأول لجلب كل التعليقات بدلاً من منشور واحد؟ (تلميح: فكر في الرابط).
  2. لنفترض أنك تريد إضافة تعليق جديد. بالنظر إلى بيانات المنشور الذي أنشأناه، ما هي الحقول التي تتوقع أن يحتوي عليها قاموس البيانات الذي سترسله في طلب POST لإنشاء تعليق جديد؟
أظهر الإجابة
  1. لتجلب كل التعليقات، ستحتاج فقط لتغيير متغير url ليصبح:
    url = "https://jsonplaceholder.typicode.com/comments"
    عندما لا تحدد id في النهاية، فإن معظم الـ APIs تعيد لك قائمة بكل العناصر.

  2. لإنشاء تعليق جديد، من المرجح أنك ستحتاج إلى قاموس بيانات يشبه هذا:

    new_comment_data = {
        "postId": 1,  # لربط التعليق بالمنشور رقم 1
        "name": "Your Name",
        "email": "your.email@example.com",
        "body": "This is my comment text."
    }
    

    الفكرة هي أن بنية البيانات تختلف باختلاف نوع المورد الذي تتعامل معه، وهذا ما ستجده موثقاً في مستندات أي API حقيقي.



ملخص الدرس وأهم النقاط

تهانينا! لقد كتبت أول برنامج يتفاعل مع العالم الخارجي. هذه مهارة جوهرية في رحلتك.

أهم النقاط التي استخلصناها:

  • مكتبة requests هي الأداة القياسية في بايثون لإرسال طلبات HTTP.
  • نستخدم requests.get(url) لجلب البيانات من خادم.
  • نستخدم requests.post(url, json=data) لإنشاء بيانات جديدة على الخادم، حيث data هو قاموس بايثون.
  • كائن response الذي يعود لنا يحتوي على معلومات قيمة مثل status_code (للتحقق من النجاح) ودالة .json() لتحويل البيانات إلى قاموس سهل التعامل.

ما التالي؟

في هذا الدرس، تعاملنا مع الاستجابة بشكل بسيط: طبعنا كل شيء على الشاشة. لكن في التطبيقات الحقيقية، rarely do we want everything. في الدرس القادم، سنتعمق أكثر في التعامل مع استجابات الـ APIs وتحليل بيانات JSON. سنتعلم كيف نتنقل داخل هياكل البيانات المعقدة التي قد تعود لنا (مثل قائمة من المنشورات)، وكيف نستخرج فقط المعلومات التي نحتاجها لتشغيل منطق برنامجنا.