لماذا مثال متجر الحيوانات الأليفة Swagger تصميم واجهة برمجة تطبيقات REST سيئ؟

Ashley Innocent

Ashley Innocent

13 مارس 2026

لماذا مثال متجر الحيوانات الأليفة Swagger تصميم واجهة برمجة تطبيقات REST سيئ؟

enterprise.banner.title

enterprise.banner.feature1

enterprise.banner.feature2

enterprise.banner.feature3

enterprise.banner.ctaB

ملخص سريع

ينتهك Swagger Petstore مبادئ REST الأساسية: فهو يستخدم أسماء موارد مفردة بشكل غير متناسق، ويتضمن أفعال عمل في عناوين URL، ويعيد رموز حالة HTTP خاطئة، ويكشف كلمات المرور في طلبات GET، ويعيد مصفوفات مجردة بدون بيانات وصفية. يعمل Modern PetstoreAPI على إصلاح كل هذه المشكلات من خلال تصميم RESTful سليم، ومعالجة الأخطاء وفقًا لمعيار RFC 9457، وأنماط جاهزة للإنتاج.

مقدمة

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

ينتهك Swagger Petstore مبادئ REST الأساسية، ويتضمن نقاط ضعف أمنية، ويعرض أنماطًا مضادة تضر بأنظمة الإنتاج. إنه مثل تعلم القيادة بسيارة تم تبديل دواستي الفرامل والوقود فيها—سوف تتعلم، ولكنك ستتعلم بشكل خاطئ.

الضرر حقيقي. المطورون الذين تعلموا من Swagger Petstore ينقلون هذه الأنماط المضادة إلى كود الإنتاج. يتم بناء واجهات برمجة التطبيقات بأسماء غير متناسقة، وطرق HTTP خاطئة، وثغرات أمنية. تفوت مراجعات الكود هذه المشكلات لأن "هذه هي طريقة Petstore".

💡
إذا كنت تقوم ببناء أو اختبار واجهات برمجة تطبيقات REST، فإن Apidog يساعدك على التحقق من تصميم API مقابل مبادئ REST، واختبار سلوك نقطة النهاية، واكتشاف عيوب التصميم قبل وصولها إلى الإنتاج. يمكنك استيراد مواصفات OpenAPI، وتشغيل اختبارات آلية، والتأكد من أن API الخاص بك يتبع اتفاقيات REST الصحيحة.
تنزيل التطبيق

في هذا الدليل، ستتعرف بالضبط على الأخطاء في Swagger Petstore، ولماذا هذه المشكلات مهمة، وكيف يصلحها Modern PetstoreAPI بأنماط جاهزة للإنتاج. سترى مقارنات جنبًا إلى جنب، وتفهم تأثير كل انتهاك، وتكتشف كيفية اختبار واجهات برمجة تطبيقاتك بشكل صحيح باستخدام Apidog.

مشكلة إرث Swagger Petstore

تم إنشاء Swagger Petstore في عام 2011 كمثال بسيط لمواصفات Swagger (الآن OpenAPI). وقد خدم غرضه: إظهار كيفية كتابة مواصفات OpenAPI. لكنه لم يكن يهدف أبدًا إلى أن يكون مرجعًا لتصميم واجهات برمجة تطبيقات REST.

لماذا أصبح المعيار الفعلي

عندما يتعلم المطورون OpenAPI، يبدأون بالمثال الرسمي. Swagger Petstore هو هذا المثال. إنه موجود في الوثائق والبرامج التعليمية ومولدات الكود. إذا كنت قد استخدمت Swagger UI أو Swagger Codegen، فقد رأيته.

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

تكلفة الأمثلة السيئة

الأمثلة السيئة تتراكم بمرور الوقت:

  1. المطورون المبتدئون يتعلمون أنماطًا مضادة - لا يعرفون أن هذه أخطاء
  2. مولدات الكود تديم المشكلات - ترث حزم SDK المولدة العيوب
  3. أدوات التوثيق تعرض أمثلة سيئة - يعرض Swagger UI Petstore بشكل افتراضي
  4. الشركات تبني واجهات برمجة تطبيقات إنتاجية بهذه الطريقة - "إذا كان جيدًا بما فيه الكفاية لـ Swagger..."

ربما أثر Swagger Petstore على عدد أكبر من تصاميم واجهات برمجة التطبيقات أكثر من أي مثال آخر في التاريخ. ولهذا السبب فإن عيوبه مهمة.

انتهاكات REST الحرجة في Swagger Petstore

دعنا نفحص انتهاكات REST المحددة في Swagger Petstore ولماذا هي خاطئة.

1. تسمية الموارد غير المتناسقة (المفرد مقابل الجمع)

الانتهاك:

GET /pet/{petId}           ← مفرد
GET /store/inventory       ← جمع
POST /pet                  ← مفرد
GET /user/{username}       ← مفرد

لماذا هو خطأ:

تمثل موارد REST مجموعات. والمجموعة تكون بصيغة الجمع. عندما تصل إلى /pets، فإنك تصل إلى مجموعة الحيوانات الأليفة. عندما تصل إلى /pets/123، فإنك تصل إلى العنصر 123 في مجموعة الحيوانات الأليفة.

خلط المفرد والجمع يكسر هذا النموذج الذهني. هل /pet/123 يصل إلى مجموعة الحيوانات الأليفة أم إلى مورد حيوان أليف واحد؟ عدم الاتساق يخلق ارتباكًا.

إصلاح Modern PetstoreAPI:

GET /pets/{petId}          ← دائمًا بصيغة الجمع
GET /stores/inventory      ← متناسق
POST /pets                 ← جمع للمجموعة
GET /users/{username}      ← جمع في كل مكان

يستخدم Modern PetstoreAPI أسماء موارد بصيغة الجمع بشكل متناسق عبر جميع نقاط النهاية. تحقق من وثائق REST API لهيكل نقطة النهاية الكاملة.

2. أفعال العمل في عناوين URL

الانتهاك:

GET /pet/findByStatus?status=available
GET /pet/findByTags?tags=tag1,tag2
GET /user/login?username=john&password=secret
GET /user/logout

لماذا هو خطأ:

يجب أن تمثل عناوين URL لـ REST الموارد (الأسماء)، وليس الإجراءات (الأفعال). طريقة HTTP هي الفعل. تعني GET /pets "احصل على مورد الحيوانات الأليفة". إضافة findByStatus زائدة عن الحاجة—هذا ما تستخدم من أجله معلمات الاستعلام.

تشير أفعال العمل في عناوين URL إلى أنك تفكر بمصطلحات RPC (استدعاء الإجراءات عن بعد)، وليس مصطلحات REST. أنت تكشف تفاصيل التنفيذ بدلاً من الموارد.

إصلاح Modern PetstoreAPI:

GET /pets?status=AVAILABLE              ← المورد + الفلتر
GET /pets?tags=tag1,tag2                ← معلمات الاستعلام للفلترة
POST /auth/login                        ← مورد مصادقة منفصل
POST /auth/logout                       ← نقاط نهاية مصادقة RESTful

يستخدم Modern PetstoreAPI معلمات الاستعلام للفلترة وموارد مصادقة منفصلة. راجع دليل المصادقة لأنماط المصادقة الصحيحة.

3. رموز حالة HTTP الخاطئة

الانتهاك:

POST /pet
Response: 200 OK          ← يجب أن يكون 201 Created

DELETE /pet/{petId}
Response: 200 OK          ← يجب أن يكون 204 No Content
{
  "message": "Pet deleted"
}

لماذا هو خطأ:

رموز حالة HTTP لها معانٍ محددة:

استخدام 200 لكل شيء يكسر دلالات HTTP. لا يمكن للعملاء التمييز بين "تم استرداد المورد" و "تم إنشاء المورد". إرجاع نص مع DELETE يهدر النطاق الترددي—لا يحتاج العميل إلى نص تأكيد.

إصلاح Modern PetstoreAPI:

POST /pets
Response: 201 Created
Location: /pets/019b4132-70aa-764f-b315-e2803d882a24
{
  "id": "019b4132-70aa-764f-b315-e2803d882a24",
  "name": "Fluffy",
  "status": "AVAILABLE"
}

DELETE /pets/{petId}
Response: 204 No Content
(لا يوجد نص)

يستخدم Modern PetstoreAPI رموز حالة HTTP الصحيحة ويتضمن رؤوس Location للموارد التي تم إنشاؤها. تحقق من دليل رموز حالة HTTP للتعيين الكامل.

4. المصفوفات المجردة بدون بيانات وصفية

الانتهاك:

GET /pet/findByStatus?status=available
Response: 200 OK
[
  {"id": 1, "name": "Fluffy"},
  {"id": 2, "name": "Buddy"}
]

لماذا هو خطأ:

إرجاع المصفوفات المجردة يخلق مشاكل:

إصلاح Modern PetstoreAPI:

GET /pets?status=AVAILABLE
Response: 200 OK
{
  "data": [
    {"id": "019b4132-70aa-764f-b315-e2803d882a24", "name": "Fluffy"},
    {"id": "019b4127-54d5-76d9-b626-0d4c7bfce5b6", "name": "Buddy"}
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "totalItems": 45,
    "totalPages": 3
  },
  "links": {
    "self": "/pets?status=AVAILABLE&page=1",
    "next": "/pets?status=AVAILABLE&page=2",
    "last": "/pets?status=AVAILABLE&page=3"
  }
}

يغلف Modern PetstoreAPI جميع المجموعات في كائنات تحتوي على بيانات وصفية وروابط HATEOAS. راجع دليل الترقيم للحصول على تفاصيل التنفيذ.

5. معايير الأخطاء المفقودة

الانتهاك:

Response: 400 Bad Request
{
  "code": 400,
  "message": "Invalid input"
}

لماذا هو خطأ:

تنسيق الخطأ هذا غير قياسي ويوفر الحد الأدنى من المعلومات:

إصلاح Modern PetstoreAPI:

Response: 400 Bad Request
Content-Type: application/problem+json
{
  "type": "https://petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "Request validation failed",
  "instance": "/pets",
  "errors": [
    {
      "field": "name",
      "message": "Name is required",
      "code": "REQUIRED_FIELD"
    },
    {
      "field": "status",
      "message": "Status must be one of: AVAILABLE, PENDING, SOLD",
      "code": "INVALID_ENUM"
    }
  ]
}

يستخدم Modern PetstoreAPI تفاصيل مشكلة RFC 9457 لجميع الأخطاء. راجع دليل معالجة الأخطاء لتنسيق الخطأ الكامل.

كوارث أمنية في التصميم القديم

بصرف النظر عن انتهاكات REST، يحتوي Swagger Petstore على مشكلات أمنية خطيرة.

طلب GET مع كلمات المرور

الانتهاك:

GET /user/login?username=john&password=secret123

لماذا هي كارثة:

تظهر كلمات المرور في طلبات GET في:

هذه ثغرة أمنية حرجة. لا ينبغي أبدًا أن تكون كلمات المرور في عناوين URL.

إصلاح Modern PetstoreAPI:

POST /auth/login
Content-Type: application/json
{
  "username": "john",
  "password": "secret123"
}

Response: 200 OK
{
  "accessToken": "eyJhbGc...",
  "refreshToken": "eyJhbGc...",
  "expiresIn": 3600
}

يستخدم Modern PetstoreAPI طريقة POST للمصادقة مع هيئات JSON. لا تظهر كلمات المرور أبدًا في عناوين URL. راجع دليل المصادقة لأنماط OAuth 2.0 و JWT.

مفاتيح API في معلمات الاستعلام

الانتهاك:

GET /pet/123?api_key=abc123secret

لماذا هو خطأ:

تحتوي مفاتيح API في معلمات الاستعلام على نفس المشكلات التي تواجهها كلمات المرور في عناوين URL:

إصلاح Modern PetstoreAPI:

GET /pets/019b4132-70aa-764f-b315-e2803d882a24
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

يستخدم Modern PetstoreAPI رؤوس Authorization القياسية لمفاتيح وتوكنات API. راجع دليل الأمان لأنماط المصادقة.

كيف يحل Modern PetstoreAPI هذه المشكلات

تم بناء Modern PetstoreAPI من الصفر لإظهار تصميم API لـ REST الصحيح. إليك ما يجعله مختلفًا:

تصميم REST جاهز للإنتاج

المعايير الحديثة

دعم بروتوكولات متعددة

على عكس Swagger Petstore (REST فقط)، يدعم Modern PetstoreAPI:

راجع دليل البروتوكولات للحصول على تفاصيل التنفيذ.

منطق عمل حقيقي

يتضمن Modern PetstoreAPI ميزات واقعية:

تحقق من وثائق API للحصول على مجموعة الميزات الكاملة.

اختبار تصميم API لـ REST باستخدام Apidog

يساعدك Apidog على التحقق من تصميم API لـ REST واكتشاف الانتهاكات قبل وصولها إلى الإنتاج.

استيراد والتحقق من مواصفات OpenAPI

# استيراد مواصفات Modern PetstoreAPI
1. افتح Apidog
2. انقر على "استيراد" ← "OpenAPI"
3. أدخل: https://petstoreapi.com/openapi.json
4. يتحقق Apidog من المواصفات وينشئ حالات اختبار

يكتشف Apidog تلقائيًا:

اختبار مبادئ REST

أنشئ حالات اختبار تتحقق من الامتثال لـ REST:

الاختبار: أسماء الموارد بصيغة الجمع

// سكريبت اختبار Apidog
pm.test("Endpoint uses plural resource name", function() {
  const url = pm.request.url.toString();
  pm.expect(url).to.match(/\/pets\/|\/orders\/|\/users\//);
  pm.expect(url).to.not.match(/\/pet\/|\/order\/|\/user\//);
});

الاختبار: رموز الحالة الصحيحة

pm.test("POST returns 201 Created", function() {
  if (pm.request.method === "POST") {
    pm.response.to.have.status(201);
    pm.response.to.have.header("Location");
  }
});

pm.test("DELETE returns 204 No Content", function() {
  if (pm.request.method === "DELETE") {
    pm.response.to.have.status(204);
    pm.expect(pm.response.text()).to.be.empty;
  }
});

الاختبار: المجموعات تحتوي على بيانات وصفية

pm.test("Collection response includes pagination", function() {
  const response = pm.response.json();
  pm.expect(response).to.have.property("data");
  pm.expect(response).to.have.property("pagination");
  pm.expect(response.pagination).to.have.property("page");
  pm.expect(response.pagination).to.have.property("totalItems");
});

مقارنة Petstore القديم بالجديد

استورد كلتا المواصفات إلى Apidog وقم بإجراء مقارنات جنبًا إلى جنب:

  1. استيراد Swagger Petstore: https://petstore.swagger.io/v2/swagger.json
  2. استيراد Modern PetstoreAPI: https://petstoreapi.com/openapi.json
  3. تشغيل اختبارات آلية على كليهما
  4. مقارنة النتائج لمعرفة الاختلافات

سيسلط Apidog الضوء على انتهاكات التصميم في Swagger Petstore ويوضح كيف يصلحها Modern PetstoreAPI.

دليل الترحيل: من تصميم Petstore القديم إلى التصميم الحديث

إذا قمت ببناء API استنادًا إلى Swagger Petstore، فإليك كيفية الترحيل إلى تصميم REST الصحيح:

الخطوة 1: إصلاح أسماء الموارد

قبل:

GET /pet/{petId}
POST /pet
DELETE /pet/{petId}

بعد:

GET /pets/{petId}
POST /pets
DELETE /pets/{petId}

استراتيجية الترحيل:

الخطوة 2: إزالة أفعال العمل

قبل:

GET /pet/findByStatus?status=available
GET /pet/findByTags?tags=tag1,tag2

بعد:

GET /pets?status=AVAILABLE
GET /pets?tags=tag1,tag2

استراتيجية الترحيل:

الخطوة 3: إصلاح رموز حالة HTTP

قبل:

POST /pet → 200 OK
DELETE /pet/{petId} → 200 OK with body

بعد:

POST /pets → 201 Created with Location header
DELETE /pets/{petId} → 204 No Content (no body)

استراتيجية الترحيل:

الخطوة 4: تغليف المجموعات

قبل:

[
  {"id": 1, "name": "Fluffy"},
  {"id": 2, "name": "Buddy"}
]

بعد:

{
  "data": [...],
  "pagination": {...},
  "links": {...}
}

استراتيجية الترحيل:

الخطوة 5: تطبيق أخطاء RFC 9457

قبل:

{
  "code": 400,
  "message": "Invalid input"
}

بعد:

{
  "type": "https://petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "Request validation failed",
  "errors": [...]
}

استراتيجية الترحيل:

التأثير الواقعي لتصميم API السيئ

لتصميم API السيئ تكاليف حقيقية:

ارتباك المطورين

عندما تنتهك واجهات برمجة التطبيقات مبادئ REST، يضيع المطورون الوقت في:

التكلفة: ساعات من وقت المطور لكل دمج

أخطاء العميل

تؤدي واجهات برمجة التطبيقات غير المتناسقة إلى أخطاء من جانب العميل:

التكلفة: حوادث الإنتاج وتأثير على العملاء

نقاط الضعف الأمنية

عيوب التصميم تخلق مخاطر أمنية:

التكلفة: اختراقات البيانات وانتهاكات الامتثال

الديون التقنية

الأمثلة السيئة تتفاقم مع مرور الوقت:

التكلفة: عبء صيانة طويل الأمد

الخلاصة

لقد أدى Swagger Petstore الغرض منه كمثال بسيط لـ OpenAPI، ولكن حان الوقت للمضي قدمًا. لقد أثرت انتهاكاته لـ REST، ومشكلاته الأمنية، وأنماطه المضادة على عدد كبير جدًا من واجهات برمجة تطبيقات الإنتاج.

يوفر Modern PetstoreAPI التنفيذ المرجعي الذي تحتاجه الصناعة: تصميم REST سليم، ومعايير حديثة، ودعم بروتوكولات متعددة، وأنماط جاهزة للإنتاج. استخدمه كمورد تعليمي ومرجع لتصميم واجهة برمجة التطبيقات.

اختبر واجهات برمجة تطبيقاتك باستخدام Apidog لاكتشاف انتهاكات التصميم مبكرًا. استورد مواصفات OpenAPI الخاصة بك، وقم بتشغيل اختبارات آلية، وتأكد من أن واجهات برمجة تطبيقاتك تتبع مبادئ REST قبل وصولها إلى الإنتاج.

الخطوات التالية:

  1. استكشف وثائق Modern PetstoreAPI
  2. قارن تصميم API الخاص بك بأنماط Modern PetstoreAPI
  3. استورد مواصفات OpenAPI الخاصة بك إلى Apidog للتحقق من الصحة
  4. أصلح انتهاكات REST باستخدام دليل الترحيل أعلاه
  5. اعتمد RFC 9457 لمعالجة الأخطاء

لقد ولى عصر أمثلة API السيئة. ابنِ واجهات برمجة التطبيقات بالطريقة الصحيحة باستخدام Modern PetstoreAPI.

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

لماذا أنشأ Swagger مثالاً سيئاً؟

تم إنشاء Swagger Petstore في عام 2011 كمثال بسيط لتوضيح مواصفات Swagger. لم يكن الغرض منه أن يكون مرجعًا لتصميم واجهات برمجة تطبيقات REST. المشكلة هي أنه أصبح المثال المعياري الفعلي، وتم نسخ عيوبه بواسطة ملايين المطورين.

هل يجب أن أتوقف عن استخدام Swagger Petstore؟

نعم، لتعلم تصميم API لـ REST. استخدم Modern PetstoreAPI بدلاً من ذلك. فهو يوضح مبادئ REST الصحيحة، والمعايير الحديثة، والأنماط الجاهزة للإنتاج. يعلم Petstore القديم أنماطًا مضادة تضر بأنظمة الإنتاج.

هل Modern PetstoreAPI جاهز للإنتاج؟

نعم. يتضمن Modern PetstoreAPI منطق عمل واقعي، ومعالجة أخطاء صحيحة، ومصادقة، وتحديد معدل الاستخدام، وميزات أمان. يمكنك نشره بحد أدنى من التعديلات أو استخدامه كمرجع لتصميم API الخاص بك.

كيف أختبر ما إذا كان API الخاص بي يتبع مبادئ REST؟

استورد مواصفات OpenAPI الخاصة بك إلى Apidog وقم بتشغيل اختبارات آلية. يتحقق Apidog من تسمية الموارد، ورموز حالة HTTP، وهياكل الاستجابة، وأنماط الأمان. يمكنك أيضًا مقارنة API الخاص بك جنبًا إلى جنب مع Modern PetstoreAPI.

ما هو أكبر خطأ في Swagger Petstore؟

استخدام GET /user/login مع كلمات المرور في معلمات الاستعلام. هذا يكشف كلمات المرور في سجل المتصفح، وسجلات الخادم، ورؤوس الإحالة—وهي ثغرة أمنية حرجة. استخدم دائمًا POST مع هيئات JSON للمصادقة.

هل يمكنني الترحيل من أنماط Swagger Petstore تدريجياً؟

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

هل يدعم Modern PetstoreAPI GraphQL و gRPC؟

نعم. على عكس Swagger Petstore (REST فقط)، يدعم Modern PetstoreAPI بروتوكولات متعددة: REST، و GraphQL، و gRPC، و WebSocket، و SSE، و MQTT، و Webhooks، و MCP. راجع دليل البروتوكولات للحصول على التفاصيل.

كيف أقنع فريقي بإصلاح تصميم API الخاص بنا؟

أظهر لهم التكاليف الحقيقية: ارتباك المطورين، وأخطاء العملاء، ونقاط الضعف الأمنية، والديون التقنية. استخدم Apidog لإظهار الانتهاكات في API الحالي الخاص بك. قارن تصميمك بـ Modern PetstoreAPI واعرض التحسينات.

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات