0Pricing
AI Agents · درس

أساسيات REST API لمطوري الوكلاء

أساليب HTTP، ورموز الحالة، والترويسات، وتنسيق طلبات واستجابات JSON

أساسيات REST API لمطوري الوكلاء درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

ما هو طلب HTTP؟

كل وكيل يتصل بخدمة خارجية يستخدم HTTP — لغة الويب. يتكون طلب HTTP من ثلاثة أجزاء أساسية: طريقة، وعنوان URL، إضافةً إلى ترويسات وجسم اختياريين.

فكروا في الطريقة على أنها فعل يخبر الخادم بما تريدون فعله، وفي عنوان URL على أنه عنوان المورد.

import requests

# A simple GET request to a public API
response = requests.get('https://api.example.com/users')
print(response.status_code)  # 200
print(response.text)          # raw JSON string

GET — جلب البيانات

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

يمكنكم تمرير المعلمات في عنوان URL كسلسلة استعلام باستخدام الوسيط params.

import requests

# Fetch users filtered by role
params = {'role': 'admin', 'page': 1, 'limit': 10}
response = requests.get(
    'https://api.example.com/users',
    params=params
)
# URL becomes: /users?role=admin&page=1&limit=10
data = response.json()
print(data['users'])

POST — إنشاء الموارد

يرسل POST البيانات إلى الخادم لإنشاء مورد جديد. يستخدم الوكلاء POST لإرسال المهام أو الرسائل، أو لتشغيل الإجراءات. توضع البيانات في جسم الطلب بصيغة JSON.

احرصوا دائمًا على تعيين ترويسة Content-Type: application/json — فمعظم واجهات API تتطلبها.

import requests
import json

payload = {
    'title': 'Research competitors',
    'assignee': 'agent-001',
    'priority': 'high'
}

response = requests.post(
    'https://api.example.com/tasks',
    json=payload  # sets Content-Type automatically
)
print(response.status_code)  # 201 Created
new_task = response.json()
print('Created task ID:', new_task['id'])

PUT وPATCH — تحديث البيانات

يستبدل PUT موردًا كاملًا ببيانات جديدة. أما PATCH فيحدّث حقولًا محددة فقط. يستخدم الوكلاء PUT عندما يملكون الكائن المحدّث كاملًا، ويستخدمون PATCH للتغييرات الجزئية مثل تحديث حالة مهمة.

import requests

task_id = '42'

# PATCH: only update the status field
response = requests.patch(
    f'https://api.example.com/tasks/{task_id}',
    json={'status': 'completed'}
)
print(response.status_code)  # 200

# PUT: replace the whole task object
full_task = {
    'title': 'Research competitors',
    'assignee': 'agent-001',
    'priority': 'low',
    'status': 'completed'
}
response = requests.put(
    f'https://api.example.com/tasks/{task_id}',
    json=full_task
)
print(response.status_code)  # 200

DELETE — إزالة الموارد

يزيل DELETE موردًا من الخادم. يستخدم الوكلاء DELETE لتنظيف البيانات المؤقتة، أو إزالة المهام التي تمت معالجتها، أو إلغاء المهام المجدولة. ولا تحتوي معظم طلبات DELETE على جسم.

يعيد الحذف الناجح عادةً 204 No Content — أي لا يوجد جسم في الاستجابة.

import requests

task_id = '42'

response = requests.delete(
    f'https://api.example.com/tasks/{task_id}'
)

if response.status_code == 204:
    print('Task deleted successfully')
elif response.status_code == 404:
    print('Task not found — already deleted?')
else:
    print('Unexpected status:', response.status_code)

رموز الحالة: نجاح 2xx

تخبر رموز الحالة وكيلكم بما إذا كان الطلب قد نجح أو فشل. ويعني النطاق 2xx النجاح:

  • 200 OK — أعاد GET أو PUT أو PATCH بيانات
  • 201 Created — أنشأ POST موردًا جديدًا
  • 204 No Content — نجح DELETE ولم يُعَد أي جسم

تحققوا دائمًا من رمز الحالة قبل معالجة جسم الاستجابة.

import requests

response = requests.post(
    'https://api.example.com/tasks',
    json={'title': 'New task'}
)

if response.status_code == 201:
    task = response.json()
    print('Created:', task['id'])
elif response.status_code == 200:
    print('Updated existing resource')
else:
    print('Unexpected code:', response.status_code)

رموز الحالة: أخطاء العميل 4xx

تعني أخطاء 4xx أن وكيلكم أرسل طلبًا غير صالح. ومن الأخطاء الشائعة:

  • 400 Bad Request — JSON غير صالح أو حقل مطلوب مفقود
  • 401 Unauthorized — مفتاح API مفقود أو غير صالح
  • 404 Not Found — المورد غير موجود
  • 429 Too Many Requests — تم تجاوز حد معدل الطلبات

تتطلب هذه الأخطاء من وكيلكم إصلاح الطلب، لا إعادة المحاولة بشكل أعمى.

import requests

response = requests.get(
    'https://api.example.com/tasks/9999',
    headers={'Authorization': 'Bearer YOUR_KEY'}
)

if response.status_code == 401:
    print('AUTH ERROR: Check your API key')
elif response.status_code == 404:
    print('Task not found')
elif response.status_code == 429:
    retry_after = response.headers.get('Retry-After', 60)
    print(f'Rate limited. Wait {retry_after}s')
elif response.status_code == 400:
    print('Bad request:', response.json().get('error'))

رموز الحالة: أخطاء الخادم 5xx

تعني أخطاء 5xx أن خطأً ما وقع من جانب الخادم — ولم يرتكب وكيلكم أي خطأ. ومن الأخطاء الشائعة:

  • 500 Internal Server Error — خطأ برمجي أو تعطل في الخادم
  • 502 Bad Gateway — فشل في الخدمة المنبع
  • 503 Service Unavailable — الخادم مثقل أو متوقف

يمكن إعادة محاولة هذه الطلبات بأمان بعد انتظار قصير.

import requests
import time

def get_with_retry(url, headers, max_retries=3):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)
        if response.status_code < 500:
            return response  # success or client error
        wait = 2 ** attempt
        print(f'Server error {response.status_code}, retrying in {wait}s...')
        time.sleep(wait)
    return response  # return last response after retries

ترويسات الطلب

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

  • Content-Type: application/json — تخبر الخادم بأن الجسم بصيغة JSON
  • Authorization: Bearer TOKEN — تصادق على طلبكم
  • Accept: application/json — تخبر الخادم بأنكم تتوقعون استلام JSON
  • User-Agent — يعرّف عميلكم (وتتطلبه بعض واجهات API)
import requests

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer sk-proj-abc123xyz',
    'Accept': 'application/json',
    'User-Agent': 'MyAgent/1.0'
}

response = requests.post(
    'https://api.example.com/analyze',
    headers=headers,
    json={'text': 'Analyze this document'}
)

print(response.json())

جسم طلب واستجابة JSON

تتبادل معظم واجهات API الحديثة البيانات بصيغة JSON. عند الإرسال، استخدموا json=payload في requests، إذ يتولى ذلك إجراء التسلسل وتعيين الترويسات تلقائيًا. وعند الاستلام، استدعوا response.json() لتحليل الجسم وتحويله إلى قاموس Python.

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

import requests

# Send JSON body
response = requests.post(
    'https://api.example.com/summarize',
    json={
        'content': 'Long article text here...',
        'max_length': 150,
        'format': 'bullet_points'
    }
)

# Parse JSON response
result = response.json()

# Always check keys exist
summary = result.get('summary', 'No summary returned')
tokens_used = result.get('usage', {}).get('total_tokens', 0)

print('Summary:', summary)
print('Tokens used:', tokens_used)

جمع الأجزاء معًا

يغلّف الوكيل المكتوب جيدًا استدعاءات API داخل دالة مساعدة واضحة، تتولى اختيار الطريقة، وتعيين الترويسات المناسبة، والتحقق من رمز الحالة، وتحليل JSON. ويجعل ذلك كل تفاعل مع API متسقًا وسهل التصحيح.

استخدموا كائن Session لإعادة استخدام الاتصالات ومشاركة الترويسات بين طلبات متعددة.

import requests

class APIClient:
    def __init__(self, base_url, api_key):
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers.update({
            'Authorization': f'Bearer {api_key}',
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        })

    def get(self, path, params=None):
        r = self.session.get(f'{self.base_url}{path}', params=params)
        r.raise_for_status()
        return r.json()

    def post(self, path, payload):
        r = self.session.post(f'{self.base_url}{path}', json=payload)
        r.raise_for_status()
        return r.json()

# Usage
client = APIClient('https://api.example.com', 'sk-proj-abc123')
tasks = client.get('/tasks', params={'status': 'open'})
new_task = client.post('/tasks', {'title': 'Write report'})

تحقق سريع: طرق HTTP

اختبروا مدى فهمكم لطرق HTTP ورموز الحالة.

مراجعة أساسيات HTTP

أصبحتم تعرفون الآن أساسيات HTTP التي يعتمد عليها كل وكيل:

  • يجلب GET البيانات، وينشئ POST الموارد، ويحدّث PUT/PATCH البيانات، ويزيل DELETE الموارد
  • 2xx = نجاح، و4xx = خطأ من وكيلكم، و5xx = خطأ من الخادم
  • تنقل الترويسات بيانات المصادقة (Authorization: Bearer) والصيغة (Content-Type: application/json)
  • استخدموا response.json() لتحليل الجسم و.get() للوصول الآمن إلى الحقول
  • يشارك كائن Session الترويسات والاتصالات بين الطلبات

وبإتقان هذه الأساسيات، يمكنكم توصيل وكيلكم بأي REST API بثقة.

الأسئلة الشائعة

هل درس «أساسيات REST API لمطوري الوكلاء» مجاني؟

نعم — نص درس «أساسيات REST API لمطوري الوكلاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «أساسيات REST API لمطوري الوكلاء»؟

أساليب HTTP، ورموز الحالة، والترويسات، وتنسيق طلبات واستجابات JSON تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أساسيات REST API لمطوري الوكلاء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات REST API لمطوري الوكلاء
  2. المصادقة: مفاتيح API وOAuth
  3. التعامل مع استجابات API وأخطائها
  4. تحديد معدل الطلبات ومنطق إعادة المحاولة
← العودة إلى AI Agents