مرحبًا بك في عالم FastAPI و WebSockets المثير! اليوم، سنغوص بعمق في تفاصيل WebSockets باستخدام FastAPI. سواء كنت مطورًا متمرسًا أو بدأت للتو، ستأخذك هذه الإرشادات خلال المفاهيم الأساسية والتنفيذات العملية لـ WebSockets. ولكن قبل أن نبدأ، لننسى أداة مفيدة ستجعل تطوير واجهة برمجة التطبيقات الخاصة بك سهلة — Apidog. يمكنك تنزيل Apidog مجانًا وتبسيط اختبار وثائق واجهة برمجة التطبيقات الخاصة بك بسهولة.
ما هو FastAPI؟
FastAPI هو إطار عمل ويب حديث وسريع (عالي الأداء) لبناء واجهات برمجة التطبيقات باستخدام Python 3.7+ بناءً على تلميحات نوع Python القياسية. يتيح لك إنشاء واجهات برمجة تطبيقات ويب بسرعة، تكون متينة وأداءها جيد. واحدة من الميزات البارزة لـ FastAPI هي قدرته على التعامل مع البرمجة غير المتزامنة و WebSockets بسهولة.
ما هي WebSockets؟
WebSockets هي بروتوكول اتصال يوفر قنوات اتصال مزدوجة الاتجاه عبر اتصال TCP واحد. على عكس HTTP، الذي هو بروتوكول طلب-استجابة، تمكن WebSockets من التواصل ثنائي الاتجاه بين العميل والخادم. وهذا يجعلها مثالية للتطبيقات في الوقت الحقيقي مثل تطبيقات الدردشة، التحديثات الحية، والألعاب.

لماذا استخدام FastAPI مع WebSockets؟
تصميم FastAPI يجعل من السهل إنشاء واجهات برمجة التطبيقات التي تدعم WebSockets. مع FastAPI، يمكنك بناء واجهات برمجة التطبيقات التي لا تكون فقط سريعة وموثوقة ولكن أيضًا تدعم الاتصال غير المتزامن باستخدام WebSockets. هذه المجموعة مثالية لتطوير التطبيقات الحديثة في الوقت الحقيقي.
بدء العمل مع FastAPI و WebSockets
لتبدأ، ستحتاج إلى تثبيت FastAPI و Uvicorn، وهو خادم ASGI لتقديم تطبيقات FastAPI الخاصة بك.
pip install fastapi uvicorn
بمجرد تثبيت الحزم الضرورية، يمكنك بدء إنشاء تطبيق FastAPI الخاص بك مع دعم WebSocket.
إنشاء تطبيق FastAPI WebSocket أساسي
لنبدأ بمثال بسيط لفهم أساسيات الاتصال عبر WebSocket في FastAPI.
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
app = FastAPI()
html = """
<!DOCTYPE html>
<html>
<head>
<title>مثال WebSocket</title>
</head>
<body>
<h1>مثال WebSocket</h1>
<button onclick="connectWebSocket()">اتصل</button>
<script>
function connectWebSocket() {
const ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = function(event) {
const message = event.data;
alert("رسالة من الخادم: " + message);
};
ws.onopen = function() {
ws.send("مرحبًا خادم");
};
}
</script>
</body>
</html>
"""
@app.get("/")
async def get():
return HTMLResponse(html)
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
data = await websocket.receive_text()
await websocket.send_text(f"نص الرسالة كان: {data}")
في هذا المثال، لدينا صفحة HTML بسيطة تتصل بخادم WebSocket عند النقر على زر. يتلقى الخادم الرسالة "مرحبًا خادم" ويرد بـ "نص الرسالة كان: مرحبًا خادم".
التعامل مع اتصالات متعددة
واحدة من نقاط القوة لـ WebSockets هي التعامل مع اتصالات العملاء المتعددة في نفس الوقت. دعونا نوسع مثالنا للتعامل مع اتصالات متعددة وبث الرسائل إلى جميع العملاء المتصلين.
from fastapi import FastAPI, WebSocket
from typing import List
app = FastAPI()
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.broadcast(f"العميل يقول: {data}")
except:
manager.disconnect(websocket)
في هذا المثال المحدّث، قدمنا فئة ConnectionManager لإدارة اتصالات WebSocket المتعددة. تقوم طريقة broadcast بإرسال رسالة إلى جميع العملاء المتصلين. بهذه الطريقة، يتلقى كل عميل أي رسالة يرسلها أي عميل آخر.
تمرير المعلمات إلى نقاط نهاية WebSocket
أحيانًا، قد تحتاج إلى تمرير معلمات إلى نقاط نهاية WebSocket الخاصة بك. يجعل FastAPI من السهل القيام بذلك. إليك مثال:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: str):
await websocket.accept()
await websocket.send_text(f"مرحبًا، عميل {client_id}")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"رسالة من {client_id}: {data}")
في هذا المثال، نحدد نقطة نهاية WebSocket تقبل معلمة client_id. يمكن استخدام هذه المعلمة لتحديد العميل وتخصيص الرسائل.
دمج WebSockets مع نقاط نهاية API
يسمح لك FastAPI بدمج الاتصال عبر WebSocket مع نقاط نهاية واجهة برمجة التطبيقات الأخرى الموجودة. هذا مفيد عندما تحتاج إلى دمج الاتصال في الوقت الحقيقي مع طلبات واجهة برمجة التطبيقات التقليدية.
from fastapi import FastAPI, WebSocket, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=404, detail="العنصر غير موجود")
return {"item_id": item_id, "name": "اسم العنصر"}
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
await websocket.send_text("متصل بـ WebSocket")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"تم الاستلام: {data}")
في هذا المثال، لدينا نقطة نهاية واجهة برمجة التطبيقات التقليدية /items/{item_id} بجانب نقطة نهاية WebSocket /ws. يمكن استخدام كلا النقطتين في نفس الوقت، مما يتيح لك التعامل مع كل من الاتصال المتزامن وغير المتزامن في تطبيقك.
اعتبارات الأمان
عند العمل مع WebSockets، من المهم مراعاة جوانب الأمان، مثل المصادقة والتفويض. يوفر FastAPI أدوات لتأمين اتصالات WebSocket الخاصة بك.
تأمين اتصالات WebSocket
يمكنك استخدام نظام حقن الاعتماديات في FastAPI لتأمين نقاط نهاية WebSocket الخاصة بك. إليك مثال لكيفية تأمين نقطة نهاية WebSocket باستخدام مصادقة بسيطة تعتمد على الرموز.
from fastapi import FastAPI, WebSocket, Depends, HTTPException, status
app = FastAPI()
def get_token_header(token: str = None):
if token != "mysecrettoken":
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="رمز غير صالح")
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket, token: str = Depends(get_token_header)):
await websocket.accept()
await websocket.send_text("متصل بـ WebSocket")
while True:
data = await websocket.receive_text()
await websocket.send_text(f"تم الاستلام: {data}")
في هذا المثال، نستخدم دالة Depends لحقن اعتماد get_token_header، التي تتحقق من صلاحية الرمز. إذا كان الرمز غير صالح، يتم رفع خطأ HTTP 403 محظور.
التعامل مع البيانات الثنائية
تدعم WebSockets أيضًا نقل البيانات الثنائية. يمكن أن يكون هذا مفيدًا لإرسال الملفات أو الصور. يجعل FastAPI من السهل التعامل مع البيانات الثنائية.
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
await websocket.send_text("متصل بـ WebSocket")
while True:
data = await websocket.receive_bytes()
await websocket.send_bytes(data)
في هذا المثال، تتلقى نقطة نهاية WebSocket البيانات الثنائية باستخدام receive_bytes وتعيدها إلى العميل باستخدام send_bytes.
تطبيقات العالم الحقيقي لـ FastAPI WebSockets
تعد WebSockets متعددة الاستخدامات للغاية ويمكن استخدامها في مجموعة متنوعة من التطبيقات الواقعية. إليك بعض الأمثلة:
تطبيق دردشة في الوقت الحقيقي
واحدة من أكثر الاستخدامات شيوعًا لـ WebSockets هو بناء تطبيقات الدردشة في الوقت الحقيقي. مع FastAPI، يمكنك بسهولة إنشاء خادم دردشة يدير عدة عملاء ويبث الرسائل في الوقت الحقيقي.
إشعارات حية
تعد WebSockets مثالية لتوصيل الإشعارات الحية. على سبيل المثال، يمكنك استخدام WebSockets لإخطار المستخدمين برسائل جديدة، تحديثات، أو تنبيهات في الوقت الحقيقي.
الألعاب عبر الإنترنت
تستخدم WebSockets على نطاق واسع في الألعاب عبر الإنترنت لتمكين الاتصال في الوقت الحقيقي بين اللاعبين. دعم FastAPI للبرمجة غير المتزامنة يجعلها خيارًا رائعًا لبناء خوادم ألعاب.
كيف يمكنك استخدام Apidog لاستكشاف أخطاء عميل WebSocket؟
إدارة واجهات برمجة التطبيقات والبيانات في الوقت الحقيقي يمكن أن تكون تحديًا. هنا يأتي دور Apidog. يبسط Apidog تطوير واجهات برمجة التطبيقات، والاختبار، والإدارة، مما يجعل من السهل التعامل مع كل من طلبات HTTP باستخدام FastAPI والتحديثات في الوقت الحقيقي باستخدام WebSockets.
- افتح Apidog: أولاً، ابدأ تطبيق Apidog وانقر على الزر "+" على الجانب الأيسر، سيتم فتح قائمة منسدلة جديدة. من هناك اختر "واجهة WebSocket API الجديدة":

2. إقامة اتصال: ابدأ بإدخال عنوان URL لـ WebSocket API في شريط عنوان Apidog. يمكنك بعد ذلك النقر على زر "اتصال" لبدء عملية المصافحة وإقامة اتصال. يتيح لك Apidog تخصيص المعلمات مثل Params وHeaders وCookies أثناء عملية المصافحة.

3. إرسال واستقبال الرسائل: بمجرد إقامة الاتصال، يمكنك إرسال الرسائل تحت علامة "الرسالة". يمكنك كتابة نص، JSON، XML، HTML، وغيرها من رسائل النصوص، بالإضافة إلى رسائل بصيغة ثنائية باستخدام Base64 أو Hexadecimal. تعرض طريقة العرض الزمنية الجديدة في Apidog حالة الاتصال، والرسائل المرسلة، والرسائل المستلمة بترتيب زمني. عندما تنقر على رسالة، يمكنك بسهولة عرض تفاصيلها.

4. توثيق واجهة برمجة التطبيقات: يرث Apidog وظيفة قوية لوثيقة واجهة برمجة التطبيقات لواجهات WebSocket، مما يتيح لك توثيق تفاعلات WebSocket الخاصة بك بفعالية.

تذكر التحقق من المشكلات الشائعة المتعلقة بـ WebSocket مثل مشاكل الاتصال، وأخطاء تنسيق الرسائل، والقلق بشأن الأمان أثناء عملية استكشاف الأخطاء وإصلاحها.
استخدام Apidog لإرسال طلبات HTTP
Apidog يقدم العديد من الميزات المتقدمة التي تعزز قدرته على اختبار طلبات HTTP. تتيح لك هذه الميزات تخصيص الطلبات الخاصة بك والتعامل مع سيناريوهات أكثر تعقيدًا بسهولة.
الخطوة 1: افتح Apidog وأنشئ طلبًا جديدًا.

الخطوة 2: ابحث عن تفاصيل واجهة برمجة التطبيقات للطلب POST الذي تريد القيام به أو أدخلها يدويًا.

الخطوة 3: املأ المعلمات المطلوبة وأي بيانات ترغب في تضمينها في جسم الطلب.

الاستنتاج
FastAPI و WebSockets هو مجموعة قوية لبناء التطبيقات الحديثة في الوقت الحقيقي. سواء كنت تبني تطبيق دردشة، أو نظام إشعارات حية، أو لعبة عبر الإنترنت، يوفر FastAPI الأدوات التي تحتاجها للتعامل مع اتصالات WebSocket بكفاءة.
لا تنسَ تنزيل Apidog مجانًا لتبسيط عملية تطوير واجهات برمجة التطبيقات الخاصة بك. يجعل Apidog من السهل اختبار وتوثيق واجهات برمجة التطبيقات الخاصة بك، مما يوفر لك الوقت والجهد.
