دليل استخدام مكتبة Requests

إذا كنت مطورًا بلغة بايثون وترغب في تنفيذ طلبات HTTP بسهولة وسلاسة، فإن مكتبة Requests هي الخيار الأمثل لك. تُعد مكتبة Requests واحدة من أكثر المكتبات شيوعًا في لغة Python بفضل بساطتها وقوتها في إرسال واستقبال البيانات عبر الإنترنت. سواء كنت ترغب في إرسال طلب GET لجلب البيانات من واجهة برمجية (API)، أو تحتاج إلى إرسال طلب POST لتحميل البيانات، فإن Requests توفر لك الأدوات التي تحتاجها بكل احترافية.

في هذا المقال، سنتعرف على كيفية تثبيت مكتبة Requests واستخدامها في تنفيذ العمليات الأساسية والمتقدمة مثل: إرسال الطلبات، تمرير المعاملات عبر عناوين URL، إدارة المحتوى النصي والثنائي، والتعامل مع الاستجابات بصيغة JSON. كما سنغطي موضوعات هامة مثل: إعداد الترويسات المخصصة، إرسال ملفات متعددة الأجزاء، إدارة الكوكيز وإعادة التوجيه، بالإضافة إلى التعامل مع الأخطاء والاستثناءات وضبط فترات الانتظار (Timeouts).

سواء كنت مبتدئًا تبحث عن فهم أساسيات مكتبة Requests أو مطورًا محترفًا تتطلع إلى تحسين مهاراتك في التعامل مع الواجهات البرمجية (APIs)، فإن هذا الدليل سيأخذك خطوة بخطوة نحو احتراف استخدام هذه المكتبة الرائعة. تابع القراءة لاكتشاف المزيد عن قوة وسهولة مكتبة Requests في Python.

تعريف مكتبة Requests في Python وأهميتها

مكتبة Requests هي واحدة من أشهر المكتبات في Python التي تُستخدم للتعامل مع بروتوكولات الإنترنت، وبشكل خاص لإرسال واستقبال طلبات HTTP و HTTPS. إنها مكتبة مفتوحة المصدر وسهلة الاستخدام، تُسهل على المطورين التعامل مع الشبكات بشكل أكثر كفاءة ومرونة.

ما هي مكتبة Requests؟

Requests هي مكتبة في Python تهدف إلى تبسيط عملية إرسال الطلبات إلى الخوادم عبر بروتوكول HTTP. يتيح لك استخدام هذه المكتبة إرسال طلبات GET، POST، PUT، DELETE، وغيرها، والحصول على الاستجابة من الخادم بسهولة. بالإضافة إلى ذلك، توفر المكتبة واجهة برمجية بسيطة للعديد من المهام المتعلقة بالشبكة مثل إضافة معلمات إلى URL، إرسال بيانات، تحميل الملفات، التعامل مع ملفات تعريف الارتباط (cookies)، والتعامل مع حالات إعادة التوجيه.

لماذا تعتبر مكتبة Requests مهمة؟

  1. سهولة الاستخدام: مكتبة Requests بسيطة وسهلة الاستخدام مقارنة بالكود المعقد الذي يتطلبه التعامل مع HTTP باستخدام مكتبات أخرى مثل urllib أو httplib. هي توفر واجهة برمجية نظيفة وسهلة الفهم بحيث يمكن للمطورين إرسال الطلبات واستقبال الاستجابات بسرعة.

  2. التعامل مع جميع أنواع الطلبات HTTP: سواء كنت بحاجة لإرسال طلب GET لاسترجاع البيانات من الخادم، أو طلب POST لإرسال البيانات، أو حتى إجراء طلبات معقدة مثل PUT و DELETE، توفر لك مكتبة Requests جميع الأدوات التي تحتاجها.

  3. إدارة المعلمات والبيانات بسهولة: يمكن للمطورين بسهولة إضافة معلمات إلى URL باستخدام معلمة params أو إرسال بيانات JSON أو نماذج باستخدام data أو json. تُسهل هذه الطريقة التعامل مع بيانات الاستمارات أو API.

  4. دعم التعامل مع الاستجابات المتعددة: مكتبة Requests توفر لك إمكانيات التعامل مع استجابات مختلفة بسهولة، مثل النصوص العادية (text)، أو الاستجابات الثنائية (binary)، أو بيانات JSON، مما يجعلها مثالية عند التعامل مع APIs.

  5. إعادة التوجيه التلقائي: تدير المكتبة عمليات إعادة التوجيه التلقائي عند تلقي رموز حالة HTTP مثل 301 أو 302، مما يعني أنك لا تحتاج للتعامل مع هذه العمليات يدويًا، مما يبسط من العملية بشكل كبير.

  6. الدعم الكامل لملفات تعريف الارتباط (Cookies): يمكنك بسهولة إرسال واستقبال ملفات تعريف الارتباط في الطلبات، مما يسهل التعامل مع الجلسات (sessions) في التطبيقات التي تتطلب الاحتفاظ بحالة المستخدم.

  7. إدارة المهلات والتعامل مع الاستثناءات: يمكن للمطورين تحديد المهلات (timeouts) لتجنب الانتظار طويلًا في حالة فشل الاتصال بالخادم. كما توفر مكتبة Requests آلية مدمجة للتعامل مع الأخطاء والاستثناءات مثل الأخطاء في الاتصال أو استجابات HTTP غير صحيحة.

  8. دعم التأليف المتقدم (Advanced Features): تحتوي المكتبة أيضًا على ميزات متقدمة مثل دعم شهادات SSL، إضافة رؤوس مخصصة (Custom Headers)، وكذلك إرسال ملفات متعددة عبر POST باستخدام ترميز multipart/form-data.

سنتعلم في هذا المقال عدة نقاط:

  1. تثبيت المكتبة
  2. إرسال طلب
  3. تمرير البيانات في الروابط
  4. محتوى الاستجابة
    1. محتوى الاستجابة النصي
    2. محتوى الاستجابة الثنائي
    3. محتوى الاستجابة بصيغة JSON
    4. محتوى الاستجابة الخام
  5. رؤوس مخصصة
  6. طلبات POST أكثر تعقيدًا
  7. إرسال ملف مشفر بطريقة Multipart-Encoded
  8. رموز حالة الاستجابة
  9. رؤوس الاستجابة
  10. ملفات تعريف الارتباط
  11. إعادة التوجيه والتاريخ
  12. المهلات
  13. الأخطاء والاستثناءات

تثبيت مكتبة Requests

لتثبيت مكتبة Requests في بايثون، تحتاج أولاً إلى التأكد من أنك قمت بتثبيت Python ومُدير الحزم pip على جهازك. تُعتبر عملية التثبيت سهلة وبسيطة ويمكن إنجازها باستخدام سطر أوامر واحد فقط.

خطوات تثبيت مكتبة Requests

  1. افتح سطر الأوامر (Command Prompt في Windows أو Terminal في macOS وLinux).
  2. قم بتنفيذ الأمر التالي:
python -m pip install requests

التحقق من نجاح التثبيت

بعد إكمال عملية التثبيت، يمكنك التحقق من نجاح التثبيت عن طريق تشغيل الأمر التالي:

python -c "import requests; print(requests.__version__)"

سيقوم هذا الأمر بعرض إصدار مكتبة Requests المثبتة على جهازك.

العمل مع بيئة افتراضية (اختياري)

لتجنب مشاكل تعارض المكتبات في المشاريع المختلفة، يُفضل استخدام بيئة افتراضية (Virtual Environment). يمكنك إنشاء بيئة افتراضية وتثبيت مكتبة Requests بداخلها كالتالي:

  1. قم بإنشاء بيئة افتراضية:

    python -m venv myenv
    
  2. فعّل البيئة الافتراضية:

    • على Windows:
      myenv\Scripts\activate
      
    • على macOS/Linux:
      source myenv/bin/activate
      
  3. قم بتثبيت مكتبة Requests داخل البيئة الافتراضية:

    python -m pip install requests
    

حل المشكلات الشائعة

  • إذا واجهت مشكلة أثناء التثبيت، تأكد من تحديث pip إلى أحدث إصدار:

    python -m pip install --upgrade pip
    
  • إذا كنت تستخدم Python 3، تأكد من أن الأمر يشير إلى الإصدار الصحيح:

    python3 -m pip install requests
    

الآن أصبحت مكتبة Requests جاهزة للاستخدام في مشاريعك.

إرسال طلب HTTP باستخدام مكتبة Requests

مكتبة Requests تجعل عملية إرسال طلبات HTTP في بايثون أمرًا بسيطًا للغاية. يمكنك إرسال طلبات GET وPOST بسهولة للحصول على البيانات أو إرسالها إلى خوادم الويب أو الواجهات البرمجية (APIs).

إرسال طلب GET

لإرسال طلب GET، كل ما تحتاجه هو استدعاء دالة requests.get() وتمرير الرابط الخاص بالموارد التي تريد الوصول إليها.

import requests

# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')

# عرض المحتوى النصي للاستجابة
print(response.text)

إرسال طلب POST

لإرسال طلب POST، يمكنك استخدام دالة requests.post() وتمرير البيانات التي تريد إرسالها كمعامل.

# إرسال طلب POST مع بيانات
data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)

# عرض استجابة الطلب
print(response.json())

شرح الكود

  • requests.get() و requests.post(): تُستخدم لإرسال طلبات HTTP من نوع GET وPOST.
  • response: يمثل استجابة الخادم لطلبك.
  • response.text: يعرض المحتوى النصي للاستجابة.
  • response.json(): يقوم بتحويل استجابة JSON إلى كائن Python (قاموس).

التحقق من نجاح الطلب

للتأكد من نجاح الطلب، يمكنك استخدام رمز الحالة (Status Code).

if response.status_code == 200:
    print("الطلب ناجح!")
else:
    print(f"حدث خطأ: {response.status_code}")

ملاحظات مهمة

  • تأكد من تمرير العنوان الصحيح (URL) عند إرسال الطلبات.
  • يمكنك إرسال رؤوس مخصصة أو بيانات مصادقة عند الحاجة، وسنتناول ذلك لاحقًا في قسم الترويسات المخصصة.

تمرير المعاملات عبر عناوين URL

في كثير من الحالات، تحتاج إلى إرسال معاملات (Parameters) مع طلبات HTTP، خاصة عند التعامل مع واجهات برمجية (APIs). تُتيح مكتبة Requests إمكانية تمرير المعاملات بسهولة باستخدام المعامل params مع دالة requests.get().

مثال على تمرير المعاملات

import requests

# الرابط مع تمرير معاملات
url = 'https://jsonplaceholder.typicode.com/comments'
params = {'postId': 1}

# إرسال طلب GET مع معاملات
response = requests.get(url, params=params)

# عرض المحتوى النصي للاستجابة
print(response.text)

شرح الكود

  • params:
    كائن قاموسي (Dictionary) يحتوي على المعاملات التي سيتم إضافتها إلى الرابط.
    المثال أعلاه يعادل طلبًا على الشكل التالي:

    https://jsonplaceholder.typicode.com/comments?postId=1
    
  • response.text:
    يعرض البيانات التي تم جلبها من الخادم كالنص.

استخدام متعدد للمعاملات

يمكنك تمرير أكثر من معامل بسهولة عن طريق إضافتها إلى القاموس:

params = {'postId': 1, 'id': 5}
response = requests.get(url, params=params)
print(response.url)  # عرض الرابط الناتج

سيُظهر الرابط الناتج:

https://jsonplaceholder.typicode.com/comments?postId=1&id=5

فوائد تمرير المعاملات

  • ديناميكية الطلبات: تسمح لك بتغيير البيانات المرسلة دون تعديل الكود.
  • تنظيم الطلبات: تجعل الكود أكثر وضوحًا وسهولة في الصيانة.

أنواع طلبات HTTP التي تدعمها مكتبة Requests

تدعم مكتبة Requests جميع أنواع طلبات HTTP الشائعة، مما يجعلها أداة مرنة للتفاعل مع الخوادم والواجهات البرمجية (APIs). إليك نظرة عامة على أهم أنواع الطلبات:

1. طلب GET

  • يُستخدم لجلب البيانات من الخادم دون تعديل أي موارد.
  • لا يتضمن هذا النوع من الطلبات إرسال بيانات حساسة أو معقدة في جسم الطلب (Body).
  • شائع الاستخدام لاسترجاع البيانات من واجهات برمجية (APIs) أو صفحات ويب.
response = requests.get('https://example.com/data')

2. طلب POST

  • يُستخدم لإرسال البيانات إلى الخادم لإنشاء موارد جديدة أو تعديل البيانات الموجودة.
  • يتضمن بيانات في جسم الطلب (Body)، مثل النماذج أو الكائنات.
  • مثالي لإرسال بيانات تسجيل الدخول أو إضافة عناصر جديدة.
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://example.com/login', data=data)

3. طلب PUT

  • يُستخدم لتحديث الموارد الموجودة على الخادم أو استبدالها بالكامل.
  • يتضمن بيانات التحديث في جسم الطلب.
data = {'title': 'Updated Title'}
response = requests.put('https://example.com/posts/1', json=data)

4. طلب PATCH

  • يُستخدم لتحديث جزء معين من الموارد الموجودة بدلاً من استبدالها بالكامل.
  • مثالي لتحديث حقل واحد فقط من الكائن.
data = {'title': 'Partially Updated Title'}
response = requests.patch('https://example.com/posts/1', json=data)

5. طلب DELETE

  • يُستخدم لحذف الموارد الموجودة على الخادم.
  • لا يتطلب عادةً جسم طلب ولكنه قد يشمل بيانات حساسة مثل المصادقة.
response = requests.delete('https://example.com/posts/1')

6. طلبات أخرى

  • HEAD: يُستخدم للحصول على معلومات رأسية فقط دون جلب محتوى البيانات.
  • OPTIONS: يُستخدم للاستعلام عن الطرق (Methods) المدعومة على الخادم.
# طلب HEAD
response = requests.head('https://example.com')

# طلب OPTIONS
response = requests.options('https://example.com')

متى تستخدم كل نوع؟

  • GET: للحصول على البيانات فقط.
  • POST: لإنشاء موارد جديدة.
  • PUT و PATCH: لتحديث البيانات (كامل أو جزئي).
  • DELETE: لحذف البيانات.
  • HEAD و OPTIONS: لاستكشاف الخادم أو اختبار الاتصال.

محتوى الاستجابة (Response Content)

عند إرسال طلب HTTP باستخدام مكتبة Requests، تكون النتيجة استجابة (Response) تحتوي على معلومات مهمة. تُتيح مكتبة Requests طرقًا متعددة للوصول إلى محتوى هذه الاستجابة، سواء كانت نصوصًا، بيانات JSON، أو محتوى ثنائي.

الوصول إلى المحتوى النصي

إذا كانت الاستجابة تحتوي على نص (مثل HTML أو نصوص خام)، يمكنك استخدام الخاصية text للحصول على محتوى النص.

import requests

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

# عرض المحتوى النصي للاستجابة
print(response.text)

الوصول إلى المحتوى بصيغة JSON

إذا كانت الاستجابة تحتوي على بيانات بصيغة JSON، يمكنك استخدام الدالة json() لتحويلها إلى كائن Python (مثل القواميس والقوائم).

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

# تحويل الاستجابة إلى JSON
data = response.json()

# عرض البيانات
print(data['title'])  # طباعة عنوان المنشور

الوصول إلى المحتوى الثنائي

يمكنك استخدام الخاصية content للحصول على المحتوى في صورة ثنائية (Binary) مفيد عند التعامل مع ملفات مثل الصور أو ملفات PDF.

response = requests.get('https://via.placeholder.com/150')

# حفظ صورة من المحتوى الثنائي
with open('image.png', 'wb') as file:
    file.write(response.content)

الوصول إلى المحتوى الخام

إذا كنت بحاجة إلى الوصول إلى المحتوى بشكل خام (Raw)، يمكنك استخدام الخاصية raw. يتطلب ذلك قراءة البيانات يدويًا.

response = requests.get('https://jsonplaceholder.typicode.com/posts/1', stream=True)

# قراءة المحتوى الخام
print(response.raw.read(10))  # قراءة أول 10 بايتات

التحقق من الترميز

Requests تحاول تخمين ترميز المحتوى تلقائيًا، ويمكنك الوصول إلى الترميز باستخدام الخاصية encoding أو تغييره يدويًا.

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

# عرض الترميز الافتراضي
print(response.encoding)

# تغيير الترميز
response.encoding = 'utf-8'

نصائح مهمة

  • استخدم response.json() فقط إذا كنت واثقًا من أن البيانات بتنسيق JSON، وإلا ستُثار استثناءات.
  • عند التعامل مع المحتوى الثنائي، تأكد من حفظ البيانات كملف بشكل صحيح لتجنب فقدان الجودة.

الترويسات المخصصة (Custom Headers)

في بعض الأحيان، تحتاج إلى إرسال ترويسات مخصصة (Custom Headers) مع طلبات HTTP. تُعتبر الترويسات وسيلة لتزويد الخادم بمعلومات إضافية حول الطلب، مثل بيانات المصادقة (Authentication) أو نوع المحتوى. مكتبة Requests تتيح إضافة الترويسات بسهولة باستخدام المعامل headers.

كيفية إرسال ترويسات مخصصة

لإرسال ترويسات مخصصة، قم بتمرير قاموس (Dictionary) يحتوي على أسماء الترويسات وقيمها إلى المعامل headers.

import requests

# تعريف الترويسات المخصصة
headers = {
    'User-Agent': 'my-app/1.0',
    'Accept': 'application/json'
}

# إرسال طلب GET مع الترويسات
response = requests.get('https://jsonplaceholder.typicode.com/posts', headers=headers)

# عرض المحتوى النصي للاستجابة
print(response.text)

شرح الكود

  • User-Agent: يُستخدم لتحديد التطبيق أو العميل الذي يقوم بإرسال الطلب.
  • Accept: يُخبر الخادم بنوع المحتوى الذي يتوقعه العميل في الاستجابة.

استخدام الترويسات للمصادقة

عند التعامل مع واجهات برمجية (APIs) تتطلب رموز الوصول (Tokens)، يمكن إرسالها ضمن الترويسات.

# تعريف الترويسات مع رمز مصادقة
headers = {
    'Authorization': 'Bearer your_access_token'
}

response = requests.get('https://api.example.com/data', headers=headers)

# عرض استجابة الطلب
print(response.json())

التحقق من الترويسات المرسلة

يمكنك التأكد من الترويسات المرسلة باستخدام الخاصية request.headers.

response = requests.get('https://jsonplaceholder.typicode.com/posts', headers=headers)

# عرض الترويسات المرسلة
print(response.request.headers)

الترويسات الافتراضية

مكتبة Requests تضيف بعض الترويسات الافتراضية، مثل User-Agent و Accept-Encoding. يمكنك تجاوزها بتحديد قيم مخصصة.

نصائح مهمة

  • تأكد من أن القيم المرسلة في الترويسات صحيحة، خاصة عند التعامل مع المصادقة أو بيانات حساسة.
  • بعض الترويسات، مثل Content-Type، تُضاف تلقائيًا عند استخدام الطلبات مثل POST و PUT بناءً على البيانات المرسلة.

طلبات POST المعقدة (More Complicated POST Requests)

عند استخدام مكتبة Requests، يُمكنك تنفيذ طلبات POST لإرسال بيانات معقدة، سواء كانت في صورة نصوص، قواميس JSON، ملفات، أو حتى إعدادات متقدمة مثل البيانات المشفرة. إليك كيفية التعامل مع طلبات POST المعقدة:

إرسال بيانات بصيغة JSON

تُسهّل مكتبة Requests إرسال البيانات بصيغة JSON باستخدام المعامل json. يتم تحويل القاموس إلى JSON تلقائيًا.

import requests

# بيانات بصيغة JSON
data = {'name': 'John Doe', 'email': 'johndoe@example.com'}

# إرسال طلب POST
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)

# عرض استجابة الطلب
print(response.json())

إرسال بيانات باستخدام Body

يمكنك استخدام المعامل data لإرسال البيانات النصية أو النموذجية عبر جسم الطلب (Body).

# إرسال بيانات النموذج
data = {'username': 'user123', 'password': 'mypassword'}
response = requests.post('https://example.com/login', data=data)

# عرض استجابة الطلب
print(response.text)

إرسال ملفات مع الطلب

إذا كنت بحاجة إلى إرسال ملفات، مثل الصور أو المستندات، يمكنك استخدام المعامل files.

# إرسال ملف
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://example.com/upload', files=files)

# عرض استجابة الطلب
print(response.text)

إرسال بيانات متعددة الأجزاء

في بعض الحالات، تحتاج إلى إرسال بيانات وملفات معًا، ويمكن القيام بذلك بسهولة:

data = {'title': 'My Document'}
files = {'file': open('example.pdf', 'rb')}

response = requests.post('https://example.com/upload', data=data, files=files)

# عرض استجابة الطلب
print(response.status_code)

إعداد الترويسات المخصصة مع طلبات POST

يمكنك تمرير ترويسات مخصصة مع طلبات POST، كما هو الحال مع طلبات GET.

headers = {'Authorization': 'Bearer your_access_token'}
data = {'content': 'This is a test'}

response = requests.post('https://api.example.com/posts', headers=headers, json=data)

# عرض استجابة الطلب
print(response.json())

نصائح مهمة

  1. استخدام json بدلاً من data: إذا كنت ترسل بيانات بتنسيق JSON، فإن استخدام json هو الطريقة الموصى بها.
  2. التعامل مع الملفات بحذر: تأكد من إغلاق الملفات بعد استخدامها.
  3. التحقق من رمز الحالة: تأكد دائمًا من نجاح الطلب باستخدام خاصية status_code.

إرسال ملف متعدد الأجزاء (POST a Multipart-Encoded File)

عند التعامل مع واجهات برمجية (APIs) تتطلب رفع ملفات متعددة الأجزاء (Multipart-Encoded Files)، تُعد مكتبة Requests أداة مثالية لإتمام هذه العملية بسهولة.

رفع ملف بسيط

يمكنك إرسال ملف واحد باستخدام المعامل files. يتم ذلك عبر تمرير ملف مفتوح في الوضع الثنائي ('rb').

import requests

# رفع ملف بسيط
files = {'file': open('example.txt', 'rb')}

response = requests.post('https://example.com/upload', files=files)

# عرض استجابة الطلب
print(response.text)

رفع ملفات متعددة

لرفع أكثر من ملف في طلب واحد، قم بتمرير عدة عناصر في القاموس files.

# رفع ملفات متعددة
files = {
    'file1': open('example1.txt', 'rb'),
    'file2': open('example2.txt', 'rb')
}

response = requests.post('https://example.com/multi-upload', files=files)

# عرض استجابة الطلب
print(response.status_code)

إرسال ملفات مع بيانات إضافية

إذا كنت بحاجة إلى إرسال بيانات وملفات في نفس الطلب، يمكن دمج المعاملين data و files.

# إرسال بيانات وملفات
data = {'description': 'This is an example upload'}
files = {'file': open('example.pdf', 'rb')}

response = requests.post('https://example.com/upload', data=data, files=files)

# عرض استجابة الطلب
print(response.json())

التعامل مع أنواع ملفات مختلفة

لإرسال ملفات بصيغ متعددة مثل الصور أو مقاطع الفيديو، تأكد من أن الخادم يدعم تنسيق الملف، حيث تقوم مكتبة Requests بتعيين نوع الملف تلقائيًا.

files = {'image': open('example.jpg', 'rb')}

response = requests.post('https://example.com/image-upload', files=files)

# عرض الاستجابة
print(response.text)

التحقق من نجاح الرفع

استخدم رموز الحالة (status_code) للتأكد من نجاح العملية.

if response.status_code == 200:
    print("تم رفع الملف بنجاح!")
else:
    print(f"حدث خطأ أثناء رفع الملف: {response.status_code}")

ملاحظات مهمة

  1. إغلاق الملفات:
    لتجنب تسرب الموارد، تأكد من إغلاق الملفات بعد استخدامها:

    with open('example.txt', 'rb') as file:
        response = requests.post('https://example.com/upload', files={'file': file})
    
  2. تحديد نوع البيانات:
    إذا تطلب الخادم تحديد نوع MIME، يمكنك تمريرها مع الملف:

    files = {'file': ('example.txt', open('example.txt', 'rb'), 'text/plain')}
    

أكواد حالة الاستجابة (Response Status Codes)

عند إرسال أي طلب HTTP باستخدام مكتبة Requests، تتلقى استجابة تحتوي على رمز حالة (Status Code) يشير إلى نتيجة الطلب. أكواد الحالة هذه تُستخدم لتحديد ما إذا كانت العملية ناجحة أو إذا كان هناك خطأ ما. أكواد الحالة تندرج ضمن مجموعات مختلفة وفقًا للنوع. إليك أهم أكواد الحالة التي قد تواجهها أثناء العمل مع مكتبة Requests:

1. أكواد الحالة الناجحة (2xx)

تدل أكواد الحالة في هذه الفئة على أن الطلب تم بنجاح.

  • 200 OK:
    هذا هو الرمز الأكثر شيوعًا، ويعني أن الطلب تم بنجاح وأن الخادم أعاد استجابة تحتوي على البيانات المطلوبة.

    if response.status_code == 200:
        print("الطلب ناجح!")
    
  • 201 Created:
    يشير إلى أن الموارد تم إنشاؤها بنجاح، وعادة ما يُستخدم عند إرسال طلبات POST.

    if response.status_code == 201:
        print("تم إنشاء المورد بنجاح!")
    
  • 204 No Content:
    يعني أن الطلب تم بنجاح ولكن لا توجد بيانات لإرجاعها (غالبًا ما يُستخدم مع طلبات DELETE).

2. أكواد الحالة التوجيهية (3xx)

تشير هذه الأكواد إلى أن هناك إعادة توجيه (Redirection) للطلب، ويجب على العميل إجراء خطوة إضافية.

  • 301 Moved Permanently:
    يشير إلى أن المورد قد تم نقله إلى الرابط جديد بشكل دائم.

  • 302 Found:
    يشير إلى أن المورد تم نقله مؤقتًا إلى الرابط جديد.

  • 303 See Other:
    يشير إلى أن العميل يجب أن يقوم بإرسال طلب آخر باستخدام طريقة GET لاسترداد المورد من الرابط آخر.

  • 307 Temporary Redirect:
    يشير إلى أن العميل يجب أن يعيد إرسال نفس الطلب إلى الرابط آخر.

3. أكواد الحالة المبدئية (4xx)

تشير أكواد الحالة في هذه الفئة إلى أن العميل قام بإرسال طلب غير صحيح أو يحتوي على خطأ.

  • 400 Bad Request:
    يعني أن الطلب غير صحيح أو يحتوي على أخطاء في البيانات المرسلة.

    if response.status_code == 400:
        print("الطلب غير صحيح!")
    
  • 401 Unauthorized:
    يشير إلى أن العميل لم يقدم بيانات المصادقة الصحيحة للوصول إلى المورد.

    if response.status_code == 401:
        print("لم يتم المصادقة!")
    
  • 403 Forbidden:
    يعني أن العميل ليس لديه الإذن للوصول إلى المورد، حتى لو كانت بيانات المصادقة صحيحة.

    if response.status_code == 403:
        print("النفاذ إلى المورد محظور!")
    
  • 404 Not Found:
    يشير إلى أن المورد المطلوب غير موجود على الخادم.

    if response.status_code == 404:
        print("المورد غير موجود!")
    

4. أكواد الحالة الخادمة (5xx)

تشير هذه الأكواد إلى أن هناك خطأ على الخادم أثناء معالجة الطلب.

  • 500 Internal Server Error:
    يعني أن هناك خطأ غير متوقع على الخادم.

  • 502 Bad Gateway:
    يعني أن الخادم الذي يعمل كبوابة (Gateway) تلقى استجابة غير صالحة من الخادم المساعد.

  • 503 Service Unavailable:
    يشير إلى أن الخدمة غير متاحة حاليًا بسبب صيانة أو مشكلة على الخادم.

  • 504 Gateway Timeout:
    يعني أن الخادم الذي يعمل كبوابة (Gateway) لم يتلقَ استجابة في الوقت المحدد من الخادم المساعد.

كيفية التعامل مع أكواد الحالة

يمكنك التحقق من رمز الحالة في الاستجابة باستخدام الخاصية status_code، واتخاذ الإجراءات المناسبة بناءً على ذلك:

if response.status_code == 200:
    print("الطلب ناجح!")
elif response.status_code == 404:
    print("المورد غير موجود!")
else:
    print(f"خطأ في الطلب: {response.status_code}")

نصائح:

  • تأكد دائمًا من التحقق من رمز الحالة لضمان أن الطلب تم بنجاح.
  • في حالة وجود أكواد حالة 4xx أو 5xx، قد تحتاج إلى مراجعة البيانات المرسلة أو التحقق من حالة الخادم.

رؤوس الاستجابة (Response Headers)

رؤوس الاستجابة (Response Headers) هي معلومات إضافية يتم إرسالها مع استجابة HTTP، وتحتوي على تفاصيل حول كيفية معالجة الطلب أو نوع المحتوى المرسل. يمكن أن تشمل هذه الرؤوس معلومات مثل نوع المحتوى، وتاريخ الاستجابة، وأذونات الوصول، وغيرها من المعلومات المتعلقة بالاستجابة.

كيفية الوصول إلى رؤوس الاستجابة

يمكنك الوصول إلى رؤوس الاستجابة عبر الخاصية headers في الكائن response. يقوم هذا الكائن بإرجاع قاموس يحتوي على كل الرؤوس المرسلة مع الاستجابة.

import requests

# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')

# عرض رؤوس الاستجابة
print(response.headers)

التعامل مع رؤوس الاستجابة

  • يمكنك الوصول إلى رأس استجابة محدد باستخدام اسمه. تذكر أن أسماء الرؤوس في HTTP غير حساسة لحالة الأحرف (case-insensitive).
# الوصول إلى رأس معين
content_type = response.headers.get('Content-Type')
print("نوع المحتوى:", content_type)

بعض رؤوس الاستجابة الشائعة

  • Content-Type: يُستخدم للإشارة إلى نوع البيانات التي يتم إرسالها في الاستجابة، مثل application/json أو text/html.

    content_type = response.headers.get('Content-Type')
    print("نوع المحتوى:", content_type)
    
  • Content-Length: يُحدد حجم المحتوى المرسل في الاستجابة بالبايت.

    content_length = response.headers.get('Content-Length')
    print("حجم المحتوى:", content_length)
    
  • Date: يُحدد تاريخ ووقت إرسال الاستجابة.

    date = response.headers.get('Date')
    print("تاريخ الاستجابة:", date)
    
  • Cache-Control: يُحدد سياسة التخزين المؤقت (caching) للاستجابة.

    cache_control = response.headers.get('Cache-Control')
    print("سياسة التخزين المؤقت:", cache_control)
    
  • Set-Cookie: يحتوي على معلومات عن ملفات تعريف الارتباط (Cookies) التي يمكن تخزينها على العميل.

    cookies = response.headers.get('Set-Cookie')
    print("ملفات تعريف الارتباط:", cookies)
    

التعامل مع ملفات تعريف الارتباط (Cookies)

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

# الوصول إلى ملفات تعريف الارتباط
cookies = response.cookies
print("ملفات تعريف الارتباط:", cookies)

تعديل رؤوس الطلب (Request Headers)

يمكنك أيضًا تعديل رؤوس الطلب عند إرسال طلب HTTP، وذلك باستخدام المعامل headers. على سبيل المثال، لتحديد نوع المحتوى الذي سيستقبله العميل أو لتضمين رمز المصادقة.

headers = {
    'Authorization': 'Bearer your_access_token',
    'Accept': 'application/json'
}

response = requests.get('https://api.example.com/data', headers=headers)
print(response.status_code)

نصائح مهمة:

  • رؤوس الاستجابة توفر معلومات حيوية حول كيفية التعامل مع البيانات المرسلة أو كيفية تخزينها.
  • تأكد دائمًا من استخدام headers بشكل صحيح عند التعامل مع APIs التي تتطلب مصادقة أو معلومات مخصصة.
  • يمكن أن تحتوي بعض الرؤوس على بيانات حساسة، مثل رموز المصادقة أو معلومات حول الجلسات، لذا تأكد من التعامل معها بعناية.

ملفات تعريف الارتباط (Cookies)

ملفات تعريف الارتباط (Cookies) هي ملفات صغيرة يتم تخزينها على جهاز العميل (مثل المتصفح) تحتوي على معلومات عن الجلسة أو تفضيلات المستخدم. يستخدمها الخادم لتتبع حالة المستخدم بين الطلبات، مثل تتبع عمليات تسجيل الدخول أو تخزين تفضيلات المستخدم.

الوصول إلى ملفات تعريف الارتباط

مكتبة Requests توفر طريقة بسيطة للوصول إلى ملفات تعريف الارتباط التي تم إرسالها من الخادم مع الاستجابة. يتم تخزين ملفات تعريف الارتباط في الخاصية cookies للكائن response. وهي تكون عبارة عن قاموس يمكن الوصول إليه كما في المثال التالي:

import requests

# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')

# الوصول إلى ملفات تعريف الارتباط
cookies = response.cookies
print("ملفات تعريف الارتباط:", cookies)

إرسال ملفات تعريف الارتباط مع الطلبات

إذا كنت بحاجة إلى إرسال ملفات تعريف الارتباط مع الطلبات، يمكنك استخدام المعامل cookies في مكتبة Requests. يُمكنك تمرير قاموس يحتوي على اسم ملف تعريف الارتباط وقيمته، وسيتم إرفاق هذه الملفات مع الطلب:

# إرسال طلب GET مع ملفات تعريف الارتباط
cookies = {'session_id': '123456789'}
response = requests.get('https://example.com/dashboard', cookies=cookies)

# عرض الاستجابة
print(response.text)

ملفات تعريف الارتباط وعمليات المصادقة

تُستخدم ملفات تعريف الارتباط بشكل شائع في عمليات المصادقة (مثل تسجيل الدخول)، حيث يقوم الخادم بإرسال ملف تعريف ارتباط خاص بالجلسة عند تسجيل الدخول بنجاح، ويتم استخدام هذا الملف في الطلبات اللاحقة لتحديد هوية المستخدم.

# إرسال طلب POST لتسجيل الدخول
login_data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://example.com/login', data=login_data)

# الوصول إلى ملفات تعريف الارتباط بعد تسجيل الدخول
cookies = response.cookies
print("ملفات تعريف الارتباط بعد تسجيل الدخول:", cookies)

# إرسال طلب آخر مع ملفات تعريف الارتباط
response = requests.get('https://example.com/profile', cookies=cookies)
print(response.text)

استخدام ملفات تعريف الارتباط للجلسات طويلة الأمد

يمكنك استخدام ملفات تعريف الارتباط لاستمرار الجلسات بين الطلبات المتعددة. على سبيل المثال، إذا كنت تعمل مع API يتطلب الجلسة، يمكنك إرسال ملفات تعريف الارتباط مع كل طلب بعد تسجيل الدخول:

# إرسال ملفات تعريف الارتباط مع طلب GET
cookies = {'session_id': 'abcdef123456'}
response = requests.get('https://example.com/user-data', cookies=cookies)
print(response.json())

إدارة ملفات تعريف الارتباط باستخدام requests.Session()

مكتبة Requests توفر أيضًا كائن Session، الذي يُستخدم لإدارة ملفات تعريف الارتباط تلقائيًا بين الطلبات المتعددة ضمن نفس الجلسة.

# إنشاء جلسة جديدة
session = requests.Session()

# إرسال طلب تسجيل الدخول (يتم تخزين ملفات تعريف الارتباط تلقائيًا)
session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})

# إرسال طلب آخر باستخدام نفس الجلسة
response = session.get('https://example.com/dashboard')
print(response.text)

نصائح مهمة:

  • عند إرسال ملفات تعريف الارتباط، تأكد من أن القيم المرسلة آمنة، خاصة إذا كانت تحتوي على معلومات حساسة مثل رموز المصادقة.
  • يمكن أن تحتوي ملفات تعريف الارتباط على تواريخ انتهاء الصلاحية، مما يعني أنه قد تحتاج إلى تجديدها في حال انتهاء صلاحيتها.
  • استخدام requests.Session() يمكن أن يسهل التعامل مع الجلسات طويلة الأمد وإدارة ملفات تعريف الارتباط بشكل أفضل.

إعادة التوجيه والتاريخ (Redirection and History)

إعادة التوجيه هي عملية يتم فيها توجيه العميل (مثل المتصفح أو مكتبة Requests) إلى الرابط جديد بعد إجراء طلب. تحدث عادةً عندما يتم نقل المورد إلى مكان آخر (بشكل دائم أو مؤقت). يمكن أن تكون هذه العملية مؤتمتة أو تتطلب من العميل اتخاذ خطوة إضافية.

مكتبة Requests تدير عملية إعادة التوجيه تلقائيًا وتخزن معلومات حول التاريخ (History) الذي يوضح جميع مراحل إعادة التوجيه.

كيفية التعامل مع إعادة التوجيه

عند إرسال طلب باستخدام مكتبة Requests، قد تتلقى استجابة مع رمز حالة يشير إلى إعادة توجيه (مثل 301 أو 302). بشكل افتراضي، يقوم Requests بمعالجة عمليات إعادة التوجيه تلقائيًا ومتابعة الرابط الجديد. لكن إذا كنت ترغب في تعطيل هذه الميزة، يمكنك تحديد ذلك باستخدام المعامل allow_redirects=False.

# تعطيل إعادة التوجيه التلقائي
response = requests.get('https://httpbin.org/redirect/3', allow_redirects=False)

# عرض رمز الحالة
print(response.status_code)  # سيظهر رمز حالة إعادة التوجيه مثل 301 أو 302

الوصول إلى التاريخ (History) لإعادة التوجيه

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

# طلب مع إعادة توجيه
response = requests.get('https://httpbin.org/redirect/3')

# عرض تاريخ عمليات إعادة التوجيه
for resp in response.history:
    print(f"رمز الحالة: {resp.status_code}، URL: {resp.url}")

ماذا يحدث في حالة إعادة التوجيه؟

  • رمز حالة 301 (Moved Permanently): يشير إلى أن المورد تم نقله بشكل دائم إلى الرابط جديد.
  • رمز حالة 302 (Found): يشير إلى أن المورد تم نقله مؤقتًا إلى الرابط آخر.
  • رمز حالة 303 (See Other): يوجه العميل إلى URL آخر باستخدام طريقة GET، بغض النظر عن الطريقة المستخدمة في الطلب الأصلي.
  • رمز حالة 307 (Temporary Redirect): يشير إلى أنه يجب على العميل إرسال نفس الطلب إلى الرابط الجديد دون تغيير الطريقة المستخدمة.

نصائح لإعادة التوجيه

  • في بعض الأحيان، قد ترغب في تجنب المتابعة التلقائية للروابط أثناء إعادة التوجيه. يمكنك تعطيل ذلك باستخدام allow_redirects=False، ثم معالجة العملية يدويًا حسب الحاجة.

    response = requests.get('https://example.com/redirect', allow_redirects=False)
    
  • احترس من الحلقات اللانهائية في إعادة التوجيه، حيث قد يعيد الخادم توجيه العميل إلى نفس الرابط عدة مرات، مما يؤدي إلى خطأ Too Many Redirects.

التحقق من النتيجة النهائية بعد إعادة التوجيه

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

# الوصول إلى الاستجابة النهائية بعد إعادة التوجيه
final_response = response
print("الاستجابة النهائية:", final_response.url)

نصائح مهمة:

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

المهلات (Timeouts)

المهلة (Timeout) هي الوقت الذي ينتظره العميل (مثل مكتبة Requests) للحصول على استجابة من الخادم قبل أن يعتبر الطلب فاشلاً. يعد تحديد المهلة جزءًا مهمًا من إدارة الطلبات HTTP، حيث يمكنك من التعامل مع المواقف التي قد يتأخر فيها الخادم أو يكون غير متاح.

تُستخدم المهلة لتجنب انتظار طويل قد يؤثر على أداء التطبيق أو يسبب تعطلًا في النظام.

كيفية تحديد المهلة

يمكنك تحديد المهلة باستخدام المعامل timeout عند إرسال الطلب. قيمة المهلة تُقاس بالثواني، وتحديدها يساعد في ضبط الوقت الذي ينتظره البرنامج قبل أن ينتهي.

import requests

try:
    # إرسال طلب GET مع مهلة
    response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
    print("الاستجابة:", response.text)
except requests.exceptions.Timeout:
    print("انتهت المهلة قبل الحصول على استجابة من الخادم")

في المثال أعلاه، إذا لم يحصل العميل على استجابة خلال 5 ثوانٍ، سيتم رفع استثناء من نوع Timeout.

استخدام مهلة الاتصال ومهلة القراءة

تسمح لك مكتبة Requests بتحديد مهلتين مختلفتين:

  1. مهلة الاتصال (Connection Timeout): الوقت الذي ينتظره العميل لمحاولة الاتصال بالخادم.
  2. مهلة القراءة (Read Timeout): الوقت الذي ينتظره العميل بعد الاتصال بالخادم لانتظار البيانات.

يمكنك تحديد كلا المهلتين باستخدام timeout كزوج من القيم: الأولى لمهلة الاتصال والثانية لمهلة القراءة.

import requests

try:
    # تحديد مهلة الاتصال ومهلة القراءة
    response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=(3, 7))
    print("الاستجابة:", response.text)
except requests.exceptions.Timeout:
    print("انتهت المهلة قبل الحصول على استجابة من الخادم")

في هذا المثال:

  • 3 ثوانٍ هي مهلة الاتصال.
  • 7 ثوانٍ هي مهلة القراءة.

التعامل مع استثناءات المهلة

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

  • requests.exceptions.Timeout: يتم رفع هذا الاستثناء إذا تجاوز العميل الوقت المحدد دون الحصول على استجابة.
  • requests.exceptions.ConnectTimeout: يتم رفعه عندما يتجاوز وقت الاتصال بالخادم.
  • requests.exceptions.ReadTimeout: يتم رفعه عندما يتجاوز وقت انتظار البيانات بعد الاتصال بالخادم.

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

import requests

try:
    response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
    print(response.text)
except requests.exceptions.Timeout:
    print("لقد انتهت المهلة!")
except requests.exceptions.RequestException as e:
    print(f"حدث خطأ: {e}")

نصائح مهمة:

  • تحديد المهلة مهم: من المهم تحديد مهلة للطلبات لضمان عدم انتظار تطبيقك لفترات طويلة في حالة عدم استجابة الخادم.
  • استخدام قيم مختلفة للمهلة: عند التعامل مع عمليات تحتاج إلى وقت طويل (مثل تحميل ملفات كبيرة)، يمكنك زيادة مهلة القراءة مقارنةً بمطالبة الاتصال.
  • التعامل مع الأخطاء: يجب دائمًا التعامل مع استثناءات المهلة بطريقة ملائمة، لضمان استمرار البرنامج في حالة حدوث تأخير أو انقطاع في الخدمة.

الأخطاء والاستثناءات (Errors and Exceptions)

عند العمل مع مكتبة Requests أو أي مكتبة شبكة أخرى، من الضروري أن تكون قادرًا على التعامل مع الأخطاء والاستثناءات. يمكن أن تحدث العديد من المشكلات أثناء إرسال واستقبال الطلبات HTTP، مثل مشكلات الاتصال أو أخطاء في الخادم، لذا يجب أن يكون لديك آلية للتعامل مع هذه الحالات بطريقة مناسبة.

أنواع الأخطاء في مكتبة Requests

  1. requests.exceptions.Timeout:

    • يحدث هذا الاستثناء عندما يتجاوز الوقت المحدد للاتصال أو قراءة الاستجابة (مهلة الاتصال أو القراءة) دون استلام استجابة من الخادم.
    • كما تحدثنا سابقًا، يمكنك تحديد المهلة باستخدام المعامل timeout، وإذا استغرق الطلب وقتًا أطول من المهلة المحددة، يتم رفع هذا الاستثناء.
    try:
        response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=3)
    except requests.exceptions.Timeout:
        print("انتهت المهلة قبل أن يتمكن الخادم من الاستجابة")
    
  2. requests.exceptions.RequestException:

    • هو الاستثناء العام لجميع الأخطاء في مكتبة Requests. يتم رفعه عند حدوث أي خطأ غير محدد، ويعتبر أبًا لجميع الاستثناءات الأخرى.
    • من الأفضل دائمًا أن تعالج هذا الاستثناء كاحتياطي في حال لم تتمكن من التعامل مع الاستثناءات الأكثر تحديدًا.
    try:
        response = requests.get('https://jsonplaceholder.typicode.com/posts')
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ في الطلب: {e}")
    
  3. requests.exceptions.HTTPError:

    • يحدث هذا الاستثناء عندما تكون استجابة HTTP تحتوي على رمز حالة يشير إلى خطأ، مثل 404 Not Found أو 500 Internal Server Error.
    • يمكنك استخدام response.raise_for_status() للتحقق من وجود خطأ في الاستجابة.
    response = requests.get('https://jsonplaceholder.typicode.com/invalid_url')
    try:
        response.raise_for_status()  # سيرتفع الاستثناء إذا كانت الاستجابة غير ناجحة
    except requests.exceptions.HTTPError as err:
        print(f"حدث خطأ في الاستجابة: {err}")
    
  4. requests.exceptions.ConnectionError:

    • يتم رفعه عندما تحدث مشكلة في الاتصال بالخادم، مثل انقطاع الشبكة أو عدم القدرة على الوصول إلى الخادم.
    try:
        response = requests.get('https://nonexistentdomain.com')
    except requests.exceptions.ConnectionError:
        print("لا يمكن الاتصال بالخادم، تحقق من الاتصال بالإنترنت")
    
  5. requests.exceptions.TooManyRedirects:

    • يتم رفعه عندما يتجاوز عدد عمليات إعادة التوجيه المسموح بها، مما يشير إلى وجود حلقة لا نهائية في إعادة التوجيه.
    try:
        response = requests.get('https://httpbin.org/redirect/10')
    except requests.exceptions.TooManyRedirects:
        print("تجاوز عدد عمليات إعادة التوجيه المسموح بها")
    
  6. requests.exceptions.URLRequired:

    • يحدث هذا الاستثناء عندما لا يتم تقديم URL صالح في الطلب. على سبيل المثال، إذا كنت تحاول إرسال طلب بدون تحديد الرابط.
    try:
        response = requests.get('')
    except requests.exceptions.URLRequired:
        print("يرجى تقديم رابط صالح")
    
  7. requests.exceptions.InvalidURL:

    • يحدث هذا الاستثناء عندما يكون الرابط غير صالح (مثل وجود مسافات أو تنسيق غير صحيح).
    try:
        response = requests.get('http://example.com')
    except requests.exceptions.InvalidURL:
        print("الرابط غير صالح")
    

التعامل مع الأخطاء باستخدام try و except

عند إرسال الطلبات، من الأفضل دائمًا وضع الكود داخل كتلة try و except للتعامل مع الأخطاء والاستثناءات بشكل مناسب. على سبيل المثال، يمكنك التحقق من وجود أخطاء HTTP، مشاكل في الاتصال، أو تجاوز المهلة.

try:
    response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
    response.raise_for_status()  # تحقق من الأخطاء في الاستجابة
    print(response.text)
except requests.exceptions.Timeout:
    print("انتهت المهلة!")
except requests.exceptions.HTTPError as e:
    print(f"خطأ HTTP: {e}")
except requests.exceptions.RequestException as e:
    print(f"حدث خطأ: {e}")

نصائح مهمة:

  • التعامل مع الأخطاء بشكل دقيق: من الأفضل معالجة كل نوع من الاستثناءات بشكل منفصل لضمان التعامل مع كل حالة بشكل ملائم.
  • استخدام raise_for_status(): استخدم هذه الطريقة للتحقق من أن استجابة الخادم كانت ناجحة (رمز حالة 200)، وإذا كانت الاستجابة تحتوي على رمز حالة خطأ، سيرتفع استثناء HTTPError.
  • التعامل مع أخطاء الاتصال: إذا كان لديك تطبيق يعتمد على الإنترنت، تأكد من أنك تتعامل مع الأخطاء المتعلقة بالاتصال بشكل صحيح، خاصة في بيئات غير مستقرة.

ملخص

مكتبة Requests هي أداة قوية وبسيطة للتعامل مع HTTP في Python، وتتيح لك إرسال واستقبال الطلبات بسهولة. باستخدام Requests، يمكنك القيام بعدة مهام متعلقة بالشبكات مثل إرسال طلبات GET وPOST، إضافة معلمات إلى URL، التعامل مع ملفات تعريف الارتباط، إدارة عمليات إعادة التوجيه، وضبط المهلات لمزيد من التحكم في عملية الاتصال.

أهم النقاط التي تناولناها في هذا المقال:

  1. تنصيب مكتبة Requests: تثبيت المكتبة باستخدام pip لتتمكن من استخدامها في مشروعك.
  2. إرسال الطلبات: استخدم requests.get() و requests.post() لإرسال الطلبات، ويمكنك إضافة معلمات أو بيانات إلى الطلبات.
  3. التعامل مع المعلمات في URL: أضف معلمات URL بسهولة باستخدام معلمة params في مكتبة Requests.
  4. أنواع الاستجابات:
    • التعامل مع الاستجابة النصية.
    • التعامل مع الاستجابة في شكل JSON.
    • التعامل مع الاستجابة الثنائية.
    • التعامل مع رؤوس الاستجابة.
  5. ملفات تعريف الارتباط (Cookies): كيفية قراءة وتخزين ملفات تعريف الارتباط المرسلة من الخادم.
  6. إعادة التوجيه (Redirection): كيفية التعامل مع عمليات إعادة التوجيه التلقائية وكيفية الوصول إلى تاريخ عمليات إعادة التوجيه.
  7. المهلات (Timeouts): ضبط مهلة الاتصال والقراءة لتحديد الوقت الذي يجب أن ينتظره البرنامج قبل أن يعتبر الطلب فاشلاً.
  8. الأخطاء والاستثناءات: تعلم كيفية التعامل مع الأخطاء مثل المهلة، أخطاء HTTP، مشاكل الاتصال، وأخطاء أخرى باستخدام try و except.

نصائح:

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

حول المحتوى:

مكتبة Requests هي واحدة من أشهر المكتبات في Python التي تُستخدم للتعامل مع بروتوكولات الإنترنت، وبشكل خاص لإرسال واستقبال طلبات HTTP و HTTPS. إنها مكتبة مفتوحة المصدر وسهلة الاستخدام.