<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yusuf Khalidd</title>
    <description>The latest articles on DEV Community by Yusuf Khalidd (@yusuf_khalidd).</description>
    <link>https://dev.to/yusuf_khalidd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821724%2F0310c456-f78f-4e57-a40e-62fa6c7bebaa.png</url>
      <title>DEV Community: Yusuf Khalidd</title>
      <link>https://dev.to/yusuf_khalidd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yusuf_khalidd"/>
    <language>en</language>
    <item>
      <title>هل لدى برونو خادم وهمي؟ (وما البديل المناسب؟)</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:22:26 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/hl-ld-brwnw-khdm-whmy-wm-lbdyl-lmnsb-19mi</link>
      <guid>https://dev.to/yusuf_khalidd/hl-ld-brwnw-khdm-whmy-wm-lbdyl-lmnsb-19mi</guid>
      <description>&lt;p&gt;برونو عميل API خفيف الوزن، مفتوح المصدر، ويعتمد على Git، لذلك يناسب الفرق التي تريد مجموعات طلبات بسيطة وقابلة للمراجعة داخل المستودع. لكن عند الحاجة إلى محاكاة نقطة نهاية غير جاهزة، تظهر الفجوة مباشرة: برونو لا يوفر خادماً وهمياً مدمجاً. في هذا الدليل العملي ستعرف متى تحتاج إلى المحاكاة، ما حدود برونو، وكيف تنشئ خادماً وهمياً من مواصفات OpenAPI بدلاً من كتابة الاستجابات يدوياً.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;الإجابة المختصرة: برونو يستطيع إرسال الطلبات وتشغيل الاختبارات، لكنه لا يستطيع تحويل طلب محفوظ إلى endpoint وهمي يُرجع استجابة عينة. إذا أردت mock server، ستحتاج إلى أداة خارجية أو خادم بسيط تكتبه بنفسك.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا تحتاج إلى خادم وهمي
&lt;/h2&gt;

&lt;p&gt;الخادم الوهمي يرجع استجابات واقعية لنقاط نهاية لم تُبنَ بعد، أو غير مستقرة، أو يصعب تشغيلها في كل مرة. استخدمه عندما تريد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;تطوير الواجهة الأمامية والجوال بالتوازي&lt;/strong&gt;: الفريق يستهلك عقد API قبل اكتمال الخلفية.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;اختبار مسارات الأخطاء&lt;/strong&gt;: مثل &lt;code&gt;429&lt;/code&gt; أو &lt;code&gt;503&lt;/code&gt; أو payload ناقص.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تشغيل عروض ونماذج أولية&lt;/strong&gt;: بدون قاعدة بيانات أو credentials أو staging server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تثبيت اختبارات CI&lt;/strong&gt;: الاختبارات لا تتوقف بسبب rate limit أو تعطل بيئة staging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;أمثلة حالات يجب أن تختبرها عمداً:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;السيناريو&lt;/th&gt;
&lt;th&gt;ما يرجعه الخادم الوهمي&lt;/th&gt;
&lt;th&gt;لماذا يصعب ذلك بدون محاكاة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;تجاوز حد المعدل&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;429&lt;/code&gt; + رأس &lt;code&gt;Retry-After&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;لا يمكنك إجبار الخلفية غالباً على التقييد عند الطلب&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تعطل الخادم&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;500&lt;/code&gt; أو &lt;code&gt;503&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;لا تريد تعطيل staging فقط للاختبار&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;استجابة بطيئة&lt;/td&gt;
&lt;td&gt;body مؤجل&lt;/td&gt;
&lt;td&gt;الكمون الحقيقي يصعب تكراره&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;نتائج فارغة&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; مع &lt;code&gt;[]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;يعتمد على حالة بيانات محددة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;حمولة مشوهة&lt;/td&gt;
&lt;td&gt;body بدون حقل مطلوب&lt;/td&gt;
&lt;td&gt;تحقق الخلفية يمنع ذلك غالباً&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  هل يمتلك برونو خادماً وهمياً؟
&lt;/h2&gt;

&lt;p&gt;لا. برونو يركز على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إرسال طلبات API.&lt;/li&gt;
&lt;li&gt;تنظيم المجموعات كملفات عادية داخل Git.&lt;/li&gt;
&lt;li&gt;تشغيل assertions واختبارات.&lt;/li&gt;
&lt;li&gt;إبقاء سير العمل بسيطاً وخفيفاً.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لكنه لا يحتوي على mock server أصلي، ولا يوجد إعداد يحوّل request محفوظاً إلى endpoint مباشر. هذا قرار نطاق، وليس خطأ في الأداة.&lt;/p&gt;

&lt;p&gt;في العمل اليومي، أمامك خياران:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;استخدام أداة محاكاة خارجية&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
مثل Mockoon أو WireMock أو Prism أو json-server. تعرّف الاستجابات هناك، ثم تضبط برونو لإرسال الطلبات إلى عنوان mock server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;كتابة خادم وهمي يدوي&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
باستخدام Express أو Flask أو FastAPI، ثم ترجع JSON ثابتاً أو مشروطاً.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال سريع باستخدام Express:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ahmed Ali&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ahmed@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/rate-limit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry-After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;60&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Too Many Requests&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mock server running on http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا مناسب لنقطة أو نقطتين. لكنه يصبح عبئاً عندما تكبر واجهة API.&lt;/p&gt;

&lt;h2&gt;
  
  
  تكلفة المحاكاة الإضافية
&lt;/h2&gt;

&lt;p&gt;ربط برونو بطبقة محاكاة منفصلة يعمل، لكنه يضيف تكلفة تشغيلية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;انحراف التعريفات&lt;/strong&gt;: مواصفات OpenAPI، طلبات برونو، وتعريفات mock قد تعيش في أماكن مختلفة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;إعداد إضافي للفريق&lt;/strong&gt;: كل مطور جديد يحتاج لتثبيت وتشغيل أداة محاكاة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;كتابة payloads يدوياً&lt;/strong&gt;: كل status code وكل response تحتاج مثالاً.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;بيانات ثابتة أكثر من اللازم&lt;/strong&gt;: responses مثل &lt;code&gt;"name": "string"&lt;/code&gt; لا تكشف أخطاء البيانات الحقيقية.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;صيانة مزدوجة&lt;/strong&gt;: عند تغيير endpoint يجب تحديث المواصفة، الطلبات، والمحاكاة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا أردت رؤية الصورة الأوسع لتراكم هذه الفجوات في سير عمل برونو، اقرأ تحليلنا عن &lt;a href="https://apidog.com/ar/blog/bruno-alternative-all-in-one-api-platform?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;منصة API المتكاملة البديلة لبرونو&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  أنشئ خادماً وهمياً من مواصفات OpenAPI بدلاً من ذلك
&lt;/h2&gt;

&lt;p&gt;الطريقة الأنظف هي توليد المحاكاة من العقد الذي تملكه بالفعل: مواصفات OpenAPI.&lt;/p&gt;

&lt;p&gt;بدلاً من كتابة mock responses في مكان منفصل، يمكنك استيراد أو كتابة المواصفات في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، ثم إنشاء خادم وهمي من نفس التعريفات المستخدمة في التصميم والاختبار والتوثيق.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-38.png" alt="" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الفكرة العملية:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;تكتب endpoint في OpenAPI.&lt;/li&gt;
&lt;li&gt;تضيف schema للطلب والاستجابة.&lt;/li&gt;
&lt;li&gt;تستخدم Apidog لتوليد mock URL.&lt;/li&gt;
&lt;li&gt;توجه الواجهة الأمامية أو الاختبارات إلى mock URL.&lt;/li&gt;
&lt;li&gt;عند تحديث schema، تتحدث المحاكاة من نفس المصدر.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال مبسط لمواصفات OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get user by ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User found&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt;
                  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
                  &lt;span class="na"&gt;created_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;date-time&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;عند توليد mock من هذا العقد، تحصل على استجابة JSON مطابقة للمخطط بدلاً من بناء server منفصل لكل endpoint.&lt;/p&gt;

&lt;p&gt;ما يميز هذا الأسلوب:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;محاكاة من المواصفات&lt;/strong&gt;: الحقول والأنواع تأتي من OpenAPI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;بيانات أكثر واقعية&lt;/strong&gt;: حقل &lt;code&gt;email&lt;/code&gt; يمكن أن يظهر كبريد إلكتروني، و&lt;code&gt;created_at&lt;/code&gt; كتاريخ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;استجابات ديناميكية&lt;/strong&gt;: لا تعتمد فقط على مثال ثابت واحد.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;بدون خادم يدوي&lt;/strong&gt;: لا تحتاج إلى Express أو Flask فقط للمحاكاة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مصدر حقيقة واحد&lt;/strong&gt;: التصميم، المحاكاة، الاختبار، والتوثيق من نفس المشروع.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كان سير عملك يعتمد على Git، يمكنك أيضاً إبقاء المواصفات قابلة للمراجعة والمقارنة مع الفريق، وهو ما يتناسب مع &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل API الأصلي لـ Git&lt;/a&gt;. ولمعرفة متى تكون المحاكاة مفيدة أكثر، راجع &lt;a href="https://apidog.com/ar/blog/api-mocking-use-cases?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;حالات استخدام محاكاة API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيفية سريعة: من OpenAPI إلى Mock URL
&lt;/h2&gt;

&lt;p&gt;اتبع هذا المسار العملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;استورد المواصفات&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
استخدم ملف OpenAPI أو Swagger، أو أدخل رابط المواصفات.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;راجع endpoints&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
تأكد أن كل endpoint يحتوي على responses وschemas واضحة.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;افتح endpoint المطلوب&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
بما أن schema موجودة، يمكن توليد response وهمي منها.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;احصل على mock URL&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
استخدم عنوان المحاكاة الذي يوفره Apidog، سواء للاستخدام المحلي أو السحابي.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;وجّه العميل إليه&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
في الواجهة الأمامية، غيّر &lt;code&gt;baseURL&lt;/code&gt; إلى عنوان المحاكاة.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://your-mock-url.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;أضف حالات خاصة عند الحاجة&lt;/strong&gt;
مثلاً response لـ &lt;code&gt;429&lt;/code&gt; أو &lt;code&gt;404&lt;/code&gt; أو payload ناقص لاختبار معالجة الأخطاء.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال اختبار بسيط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;handles rate limit response&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://your-mock-url.example.com/rate-limit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry-After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeTruthy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا يمكن لفريق الواجهة الأمامية أو الجوال أو الاختبارات العمل قبل اكتمال الخلفية.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تكون الحلول البديلة كافية؟
&lt;/h2&gt;

&lt;p&gt;لا تحتاج دائماً إلى محاكاة مبنية على المواصفات. استخدام برونو مع أداة خارجية أو خادم صغير يكفي عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;لديك endpoint أو اثنان فقط للاختبار المحلي.&lt;/li&gt;
&lt;li&gt;الفريق يريد البقاء بالكامل داخل ملفات برونو.&lt;/li&gt;
&lt;li&gt;response ثابت يكفي ولا تحتاج بيانات متنوعة.&lt;/li&gt;
&lt;li&gt;لديك بالفعل Mockoon أو WireMock أو Prism في سير العمل.&lt;/li&gt;
&lt;li&gt;مصدر الحقيقة الإضافي لا يسبب بطئاً أو أخطاء صيانة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;المقايضة واضحة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;برونو + أداة محاكاة منفصلة&lt;/strong&gt;: بسيط كبداية، لكنه يضيف صيانة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;محاكاة من OpenAPI&lt;/strong&gt;: تقلل الانحراف، لكنها تعتمد على منصة أوسع.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;اختر بناءً على حجم API وعدد الفرق التي تعتمد عليها.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل يمتلك برونو خادم محاكاة مدمج؟
&lt;/h3&gt;

&lt;p&gt;لا. برونو عميل API لإرسال الطلبات وتشغيل الاختبارات. لا يحتوي على mock server أصلي. لمحاكاة endpoints، استخدم أداة خارجية أو اكتب خادماً وهمياً ووجّه برونو إليه.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما أسهل طريقة لإضافة المحاكاة إلى سير عمل يشبه برونو؟
&lt;/h3&gt;

&lt;p&gt;استخدم مواصفات OpenAPI كمصدر الحقيقة، ثم ولّد mock server منها. أدوات مثل Apidog تقرأ المواصفات وتوفر mock URL جاهزاً، بدلاً من تعريف الاستجابات في مكان منفصل.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني الاستمرار في استخدام برونو وإضافة خادم محاكاة بجانبه؟
&lt;/h3&gt;

&lt;p&gt;نعم. يمكنك تشغيل Mockoon أو WireMock أو Prism، ثم توجيه برونو إلى عنوان الخادم الوهمي. هذا يعمل، لكن المواصفات، الطلبات، وبيانات المحاكاة ستعيش في أماكن منفصلة وقد تنحرف بمرور الوقت.&lt;/p&gt;

&lt;h3&gt;
  
  
  متى أكتب mock server يدوياً؟
&lt;/h3&gt;

&lt;p&gt;اكتبه عندما تحتاج تجربة سريعة أو endpoint مؤقتاً. لكن إذا أصبحت تضيف عشرات endpoints أو status codes مختلفة، فالأفضل توليد المحاكاة من OpenAPI لتقليل الصيانة.&lt;/p&gt;

&lt;p&gt;إذا أصبحت صيانة طبقة محاكاة منفصلة أثقل من فائدتها، جرّب المحاكاة المعتمدة على المواصفات. استورد ملف OpenAPI إلى &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، وستحصل على mock URL عملي خلال دقائق بدون استضافة خادم إضافي.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>بديل برونو: حلول متكاملة تتجاوز Git</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 10:17:00 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/bdyl-brwnw-hlwl-mtkml-ttjwz-git-3h6m</link>
      <guid>https://dev.to/yusuf_khalidd/bdyl-brwnw-hlwl-mtkml-ttjwz-git-3h6m</guid>
      <description>&lt;p&gt;اكتسب برونو شعبيته لسبب وجيه: يتعامل مع مجموعات واجهات برمجة التطبيقات (API) كنص عادي على القرص، يعمل دون اتصال، ولا يطلب تسجيل الدخول. إذا كنت تريد عميل طلبات محليًا وخفيفًا وقابلًا للمراجعة عبر Git، فبرونو ينجز هذه المهمة جيدًا.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;لكن دعم Git لم يعد ميزة نادرة. معظم أدوات API الجادة يمكنها اليوم تخزين المواصفات أو الملفات داخل مستودع. لذلك، عند مقارنة برونو بمنصة API شاملة، السؤال العملي ليس: "هل تدعم Git؟" بل: "بعد أن تعيش الطلبات أو المواصفات في Git، ما الذي يحتاجه سير العمل أيضًا؟"&lt;/p&gt;

&lt;p&gt;هذا المقال يوضح أين يكون برونو مناسبًا، وأين تبدأ الحاجة إلى منصة أوسع مثل Apidog عندما يدخل التصميم، المحاكاة، التوثيق، الاختبار، والتعاون ضمن نفس دورة حياة الـ API.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما يفعله برونو جيدًا
&lt;/h2&gt;

&lt;p&gt;برونو مناسب جدًا عندما يكون هدفك الأساسي هو إرسال الطلبات محليًا وإدارة المجموعة كملفات.&lt;/p&gt;

&lt;h3&gt;
  
  
  نقاط القوة العملية
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ملفات &lt;code&gt;.bru&lt;/code&gt; نصية عادية&lt;br&gt;&lt;br&gt;
كل طلب يُخزن كملف قابل للقراءة داخل مشروعك. يمكنك فتحه في أي محرر، مراجعته في Git، ومقارنة التغييرات بسهولة.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;يعمل دون اتصال&lt;br&gt;&lt;br&gt;
لا توجد مزامنة سحابية إلزامية أو اعتماد على حساب. افتح الأداة وابدأ إرسال الطلبات.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git هو طبقة التخزين&lt;br&gt;&lt;br&gt;
بما أن الملفات موجودة داخل المستودع، تصبح الفروع، مراجعات Pull Request، والاختلافات جزءًا طبيعيًا من سير العمل.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;مفتوح المصدر&lt;br&gt;&lt;br&gt;
برونو مفتوح المصدر، وله مجتمع نشط وعدد كبير من النجوم على GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;خفيف ولا يتطلب تسجيل دخول&lt;br&gt;&lt;br&gt;
مناسب للمطورين الأفراد، فرق DevOps، أو أي شخص يريد عميل طلبات محليًا بدون إعدادات كثيرة.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال على سير عمل بسيط مع برونو:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:your-org/api-requests.git
&lt;span class="nb"&gt;cd &lt;/span&gt;api-requests

&lt;span class="c"&gt;# افتح المشروع في Bruno&lt;/span&gt;
&lt;span class="c"&gt;# عدّل الطلبات&lt;/span&gt;
git diff
git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"Update user API request"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كان كل ما تحتاجه هو عميل طلبات سريع، محلي، وقابل للمراجعة عبر Git، فبرونو خيار قوي.&lt;/p&gt;

&lt;h2&gt;
  
  
  أين يتوقف عميل الطلبات الواحد
&lt;/h2&gt;

&lt;p&gt;تظهر حدود برونو عندما ينتقل العمل من "إرسال طلبات" إلى "بناء API كمنتج" مع فريق كامل.&lt;/p&gt;

&lt;p&gt;عميل الطلبات، بطبيعته، يغطي جزءًا واحدًا فقط من دورة الحياة.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. لا يوجد خادم وهمي مدمج
&lt;/h3&gt;

&lt;p&gt;برونو يرسل الطلبات إلى API موجودة. لكن ماذا لو لم تكن الواجهة الخلفية جاهزة بعد؟&lt;/p&gt;

&lt;p&gt;في هذه الحالة ستحتاج إلى:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أداة Mock منفصلة&lt;/li&gt;
&lt;li&gt;أو خدمة وهمية مخصصة&lt;/li&gt;
&lt;li&gt;أو سكربت محلي يعيد استجابات ثابتة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا يضيف طبقة أخرى يجب مزامنتها مع تعريف الـ API.&lt;/p&gt;

&lt;p&gt;للمزيد حول هذه الفجوة: &lt;a href="https://apidog.com/ar/blog/bruno-mock-server-alternative?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;بديل لخادم برونو الوهمي&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. لا توجد وثائق مستضافة تلقائيًا
&lt;/h3&gt;

&lt;p&gt;ملفات &lt;code&gt;.bru&lt;/code&gt; مفيدة للمطورين، لكنها ليست موقع توثيق يمكن مشاركته مع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فريق الواجهة الأمامية&lt;/li&gt;
&lt;li&gt;العملاء&lt;/li&gt;
&lt;li&gt;فرق QA&lt;/li&gt;
&lt;li&gt;الشركاء الخارجيين&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا أردت وثائق عامة أو داخلية، ستحتاج إلى مولد وثائق أو منصة منفصلة.&lt;/p&gt;

&lt;p&gt;مزيد من التفاصيل: &lt;a href="https://apidog.com/ar/blog/bruno-api-documentation-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;توليد وثائق واجهة برمجة التطبيقات لبرونو&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. يعتمد على الطلب أولًا، لا التصميم أولًا
&lt;/h3&gt;

&lt;p&gt;نموذج برونو يبدأ من طلب تريد إرساله.&lt;/p&gt;

&lt;p&gt;لكن فرق التصميم أولًا تحتاج غالبًا إلى تعريف العقد قبل كتابة الكود:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get user by ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في هذا النوع من الفرق، تكون مواصفة OpenAPI هي مصدر الحقيقة، ثم تُبنى منها المحاكاة، الوثائق، الاختبارات، وربما SDKs.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. أدوات البروتوكولات والتوليد محدودة
&lt;/h3&gt;

&lt;p&gt;برونو يركز أساسًا على HTTP. إذا كان مشروعك يستخدم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;li&gt;SOAP&lt;/li&gt;
&lt;li&gt;توليد SDK&lt;/li&gt;
&lt;li&gt;توليد server stubs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;فستحتاج غالبًا إلى أدوات إضافية.&lt;/p&gt;

&lt;p&gt;هذه ليست عيوبًا في برونو، بل حدود طبيعية لأداة صممت لتكون عميل طلبات خفيفًا ومباشرًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما تضيفه المنصة الشاملة
&lt;/h2&gt;

&lt;p&gt;منصة API شاملة تجمع أجزاء دورة الحياة في مساحة عمل واحدة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التصميم&lt;/li&gt;
&lt;li&gt;التصحيح&lt;/li&gt;
&lt;li&gt;المحاكاة&lt;/li&gt;
&lt;li&gt;الاختبار&lt;/li&gt;
&lt;li&gt;التوثيق&lt;/li&gt;
&lt;li&gt;التعاون&lt;/li&gt;
&lt;li&gt;التكامل مع Git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بدلًا من ربط عدة أدوات منفصلة، تعمل كل هذه المراحل فوق تعريف API واحد.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-35.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-35.png" alt="" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الميزة العملية هنا هي تقليل الانحراف بين الأدوات.&lt;/p&gt;

&lt;p&gt;عندما تعدّل مخطط نقطة نهاية، يجب أن ينعكس ذلك على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;الوثائق&lt;/li&gt;
&lt;li&gt;الخادم الوهمي&lt;/li&gt;
&lt;li&gt;اختبارات API&lt;/li&gt;
&lt;li&gt;الطلبات المستخدمة في التصحيح&lt;/li&gt;
&lt;li&gt;مراجعات الفريق&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في منصة موحدة، لا تحتاج إلى إعادة مزامنة يدوية بين عدة أدوات.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف يبدو سير العمل في Apidog
&lt;/h2&gt;

&lt;p&gt;تم بناء Apidog حول فكرة أن مواصفة الـ API يمكن أن تكون مصدر الحقيقة لكل شيء.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. صمّم نقطة النهاية أولًا
&lt;/h3&gt;

&lt;p&gt;يمكنك تعريف نقطة النهاية والمخططات والاستجابات من محرر مرئي، أو استيراد OpenAPI موجود.&lt;/p&gt;

&lt;p&gt;مثال مواصفة مبسطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.0&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get user by ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User object&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. شغّل Mock من نفس المخطط
&lt;/h3&gt;

&lt;p&gt;بدلًا من إنشاء خدمة وهمية منفصلة، يمكن توليد محاكاة من تعريف نقطة النهاية.&lt;/p&gt;

&lt;p&gt;هذا مفيد عندما يعمل فريق الواجهة الأمامية قبل جاهزية الواجهة الخلفية.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. أنشئ الوثائق من نفس المصدر
&lt;/h3&gt;

&lt;p&gt;الوثائق لا تكون ملفًا منفصلًا يحتاج إلى تحديث يدوي. يتم توليدها من نفس المواصفة التي يستخدمها الفريق للتصميم والاختبار.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. اختبر الطلبات داخل نفس المساحة
&lt;/h3&gt;

&lt;p&gt;يمكنك إرسال الطلبات، بناء سيناريوهات اختبار، وتشغيلها ضمن سير عمل CI حسب احتياج الفريق.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. تعاون من تعريف واحد
&lt;/h3&gt;

&lt;p&gt;بدل أن يمتلك كل مطور نسخة محلية مختلفة من الحقيقة، يعمل الفريق على مشروع مشترك مع أدوار ومراجعة وتحديثات مرتبطة بنفس تعريف الـ API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-36.png" alt="" width="799" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الفكرة ليست أن "المزيد من الميزات" أفضل دائمًا. الفكرة أن هذه المراحل موجودة بالفعل في أغلب فرق API. السؤال هو: هل تريدها متصلة في مكان واحد، أم موزعة بين أدوات منفصلة؟&lt;/p&gt;

&lt;h2&gt;
  
  
  أبيدوج يدعم Git أيضًا الآن
&lt;/h2&gt;

&lt;p&gt;الاعتماد على منصة شاملة لا يعني بالضرورة التخلي عن سير عمل Git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-37.png" alt="" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;يتيح لك &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;نمط Spec-First&lt;/a&gt; في Apidog تعديل تعريف API مباشرة كـ OpenAPI YAML أو JSON، مع مزامنة ثنائية الاتجاه مع المستودع.&lt;/p&gt;

&lt;p&gt;عمليًا، يمكن أن يبدو سير العمل هكذا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; update-user-schema

&lt;span class="c"&gt;# عدّل openapi.yaml في محررك&lt;/span&gt;
git diff

git add openapi.yaml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update user response schema"&lt;/span&gt;
git push origin update-user-schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم يمكن أن ينعكس التغيير داخل Apidog.&lt;/p&gt;

&lt;p&gt;وبالعكس، إذا تم تعديل التعريف داخل Apidog، يمكن مزامنته مرة أخرى مع ملف OpenAPI الذي يتتبعه Git.&lt;/p&gt;

&lt;p&gt;بهذا تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مراجعة عبر Pull Requests&lt;/li&gt;
&lt;li&gt;اختلافات قابلة للقراءة&lt;/li&gt;
&lt;li&gt;مصدر حقيقة واحد&lt;/li&gt;
&lt;li&gt;تصميم، Mock، وثائق، واختبارات مبنية على نفس المواصفة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا أردت مقارنة أطول: &lt;a href="https://apidog.com/ar/blog/apidog-vs-bruno?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog مقابل برونو&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;وإذا كان Git هو محور سير عملك: &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل سير عمل API المتوافق مع Git&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  مقارنة جنبًا إلى جنب: برونو مقابل منصة شاملة
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الميزة&lt;/th&gt;
&lt;th&gt;برونو&lt;/th&gt;
&lt;th&gt;أبيدوج&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;المواصفات المتوافقة مع Git&lt;/td&gt;
&lt;td&gt;نعم، ملفات &lt;code&gt;.bru&lt;/code&gt; في مستودعك&lt;/td&gt;
&lt;td&gt;نعم، OpenAPI YAML/JSON مع مزامنة Git ثنائية الاتجاه عبر نمط Spec-First&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;خادم وهمي مدمج&lt;/td&gt;
&lt;td&gt;لا، تحتاج إلى أداة منفصلة&lt;/td&gt;
&lt;td&gt;نعم، يتم إنشاؤه من المخطط&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;وثائق مستضافة / مُنشأة تلقائيًا&lt;/td&gt;
&lt;td&gt;لا&lt;/td&gt;
&lt;td&gt;نعم، من نفس المواصفة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تصميم API مرئي&lt;/td&gt;
&lt;td&gt;لا، يعتمد على الطلب أولًا&lt;/td&gt;
&lt;td&gt;نعم، محرر مرئي يدعم التصميم أولًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;البروتوكولات بخلاف HTTP&lt;/td&gt;
&lt;td&gt;HTTP بشكل أساسي&lt;/td&gt;
&lt;td&gt;HTTP وgRPC وWebSocket وSOAP، بالإضافة إلى توليد SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مفتوح المصدر / التسعير&lt;/td&gt;
&lt;td&gt;مفتوح المصدر، مجاني، لا يتطلب حسابًا&lt;/td&gt;
&lt;td&gt;طبقة مجانية، خطط مدفوعة للفرق، يتطلب حسابًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;الأفضل لـ&lt;/td&gt;
&lt;td&gt;الأفراد وفرق DevOps التي تريد عميلًا محليًا خفيفًا&lt;/td&gt;
&lt;td&gt;الفرق التي تريد توحيد التصميم، الوثائق، المحاكاة، والاختبار&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;لا تقرأ الجدول كلوحة نتائج. برونو يحسن تجربة عميل الطلبات المحلي. Apidog يحسن دورة حياة API كاملة مع دعم Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  من يجب أن يختار برونو؟
&lt;/h2&gt;

&lt;p&gt;اختر برونو إذا كانت حالتك تشبه الآتي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تعمل غالبًا بمفردك أو ضمن فريق صغير&lt;/li&gt;
&lt;li&gt;تحتاج فقط إلى إرسال طلبات HTTP&lt;/li&gt;
&lt;li&gt;تريد ملفات محلية قابلة للمراجعة في Git&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى Mock مدمج&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى وثائق مستضافة&lt;/li&gt;
&lt;li&gt;لا تريد حسابًا أو منصة سحابية&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في هذه الحالة، برونو عملي ومباشر.&lt;/p&gt;

&lt;h2&gt;
  
  
  من يجب أن يختار منصة شاملة مثل Apidog؟
&lt;/h2&gt;

&lt;p&gt;اختر منصة شاملة مثل &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; إذا كانت الـ API منتجًا مشتركًا بين عدة أطراف:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فريق Backend يصمم وينفذ&lt;/li&gt;
&lt;li&gt;فريق Frontend يحتاج Mock مبكرًا&lt;/li&gt;
&lt;li&gt;فريق QA يحتاج اختبارات قابلة للتشغيل&lt;/li&gt;
&lt;li&gt;العملاء أو الشركاء يحتاجون وثائق&lt;/li&gt;
&lt;li&gt;الفريق يريد مراجعة المواصفات في Git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال عملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;صمّم endpoint في OpenAPI.&lt;/li&gt;
&lt;li&gt;راجع التغيير في Pull Request.&lt;/li&gt;
&lt;li&gt;شغّل Mock للواجهة الأمامية.&lt;/li&gt;
&lt;li&gt;ولّد الوثائق للفريق.&lt;/li&gt;
&lt;li&gt;استخدم نفس التعريف في اختبارات API.&lt;/li&gt;
&lt;li&gt;حافظ على المواصفة في Git.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;إذا كنت تفعل هذه الخطوات عبر أربع أدوات منفصلة، فإن منصة موحدة قد تقلل التعقيد.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل أبيدوج بديل مباشر لبرونو؟
&lt;/h3&gt;

&lt;p&gt;بالنسبة لمهمة إرسال الطلبات، نعم، يتضمن Apidog عميل طلبات ويمكنه التعامل مع مواصفات OpenAPI. الفرق هو النطاق: برونو يركز على عميل الطلبات، بينما يضيف Apidog التصميم، المحاكاة، التوثيق، الاختبار، والتعاون.&lt;/p&gt;

&lt;p&gt;إذا كنت تريد عميلًا فقط، قد يكون برونو أخف. إذا كنت تريد دورة حياة API كاملة، فـ Apidog يغطي نطاقًا أوسع.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني الاحتفاظ بمواصفات API في Git باستخدام Apidog كما أفعل مع برونو؟
&lt;/h3&gt;

&lt;p&gt;نعم. نمط Spec-First في Apidog يسمح بتخزين تعريف API كـ OpenAPI YAML أو JSON مع مزامنة ثنائية الاتجاه مع المستودع. هذا يحافظ على مراجعات Git، الفروع، والاختلافات القابلة للقراءة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل برونو لا يزال خيارًا جيدًا في عام 2026؟
&lt;/h3&gt;

&lt;p&gt;نعم. برونو لا يزال خيارًا قويًا إذا كنت تريد عميل طلبات مفتوح المصدر، محليًا، وخفيفًا. القرار ليس "برونو أم Apidog" بشكل مطلق، بل يعتمد على نطاق العمل.&lt;/p&gt;

&lt;p&gt;استخدم برونو عندما تحتاج إلى عميل طلبات فقط. استخدم منصة شاملة عندما تحتاج إلى إدارة دورة حياة API كاملة.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;إذا كان برونو يغطي كل احتياجاتك، فاستمر في استخدامه. إنه أداة قوية لعميل طلبات محلي يعتمد على الملفات وGit.&lt;/p&gt;

&lt;p&gt;لكن إذا كان فريقك يضيف حوله أدوات منفصلة للمحاكاة، التوثيق، التصميم، والاختبار، فهذه إشارة إلى أن المشكلة لم تعد في عميل الطلبات نفسه، بل في دورة حياة الـ API بالكامل.&lt;/p&gt;

&lt;p&gt;يمكنك &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تجربة Apidog&lt;/a&gt; مع الحفاظ على سير عمل متوافق مع Git.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>كيفية إنشاء واستضافة وثائق API من Bruno؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 09:34:30 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-nsh-wstdf-wthyq-api-mn-bruno-me8</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-nsh-wstdf-wthyq-api-mn-bruno-me8</guid>
      <description>&lt;p&gt;إذا كنت تستخدم Bruno، فأنت تستفيد غالبًا من أهم ميزاته: مجموعات API محفوظة كملفات &lt;code&gt;.bru&lt;/code&gt; داخل مستودع Git، قابلة للمراجعة مع الكود، وتعمل بدون حساب سحابي. هذا ممتاز للاختبار الداخلي والعمل بأسلوب offline-first، لكنه لا يحل دائمًا مشكلة نشر توثيق API قابل للمشاركة مع الفريق أو العملاء.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;السؤال العملي الذي يظهر لاحقًا هو: &lt;strong&gt;كيف أرسل رابطًا للتوثيق؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bruno يساعدك على تنظيم الطلبات وتشغيلها، لكنه لا يوفر بوابة توثيق عامة مستضافة تلقائيًا. في هذا الدليل سنحدد ما الذي يقدمه Bruno فعلًا، أين تظهر الفجوة، وكيف تنشئ توثيق API قابلًا للنشر من مواصفات OpenAPI باستخدام سير عمل أكثر قابلية للتنفيذ.&lt;/p&gt;




        
        
    


&lt;h2&gt;
  
  
  ما الذي تحتاجه الفرق فعليًا من توثيق API؟
&lt;/h2&gt;

&lt;p&gt;قبل اختيار الأداة، حدّد متطلبات التوثيق. في أغلب فرق التطوير، التوثيق الجيد يحتاج إلى ثلاثة عناصر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;رابط قابل للمشاركة&lt;/strong&gt;: يجب أن يستطيع مطورو الواجهة الأمامية، QA، الشركاء، أو العملاء فتح التوثيق من المتصفح بدون تثبيت Bruno أو استنساخ المستودع.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مزامنة مع العقد الحقيقي للـ API&lt;/strong&gt;: إذا تغيرت نقطة نهاية أو مخطط استجابة، يجب أن ينعكس ذلك في التوثيق. التوثيق غير المتزامن يسبب أخطاء أكثر مما يحل.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تجربة تفاعلية&lt;/strong&gt;: من الأفضل أن يستطيع المستخدم إرسال طلب مباشر من صفحة التوثيق عبر لوحة “جرّبها”، مع المعلمات والرؤوس والمصادقة والأمثلة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كان التوثيق يفتقد أحد هذه العناصر، سيعود المطورون غالبًا إلى سؤال الفريق مباشرة بدل الاعتماد على المستندات.&lt;/p&gt;
&lt;h2&gt;
  
  
  ماذا يوفر Bruno للتوثيق؟
&lt;/h2&gt;

&lt;p&gt;Bruno يقدم أساسًا جيدًا للتوثيق الداخلي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ملفات &lt;code&gt;.bru&lt;/code&gt; نصية وقابلة للقراءة.&lt;/li&gt;
&lt;li&gt;يمكن حفظها داخل Git.&lt;/li&gt;
&lt;li&gt;يمكن مراجعة تغييرات الطلبات في Pull Requests.&lt;/li&gt;
&lt;li&gt;يدعم Bruno كتلة &lt;code&gt;docs&lt;/code&gt; لكل طلب.&lt;/li&gt;
&lt;li&gt;يمكن عرض Markdown داخل التطبيق.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال مبسط على فكرة ملف طلب داخل Bruno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meta {
  name: Get User
  type: http
}

get {
  url: {{baseUrl}}/users/{{userId}}
}

headers {
  Authorization: Bearer {{token}}
}

docs {
  # Get User

  يعيد بيانات مستخدم واحد بناءً على userId.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا مفيد جدًا لفريق داخلي يستخدم Bruno بالفعل. أي مطور داخل المستودع يستطيع فتح الملف وفهم الطلب وسياقه.&lt;/p&gt;

&lt;p&gt;لكن المشكلة تبدأ عند الحاجة إلى نشر التوثيق خارج التطبيق.&lt;/p&gt;

&lt;h2&gt;
  
  
  أين تظهر فجوة Bruno؟
&lt;/h2&gt;

&lt;p&gt;Bruno لا يوفر بوابة توثيق عامة مدمجة ومستضافة تلقائيًا. لا يوجد زر نشر يحوّل المجموعة إلى موقع ويب ثابت مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://docs.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ولا توجد بوابة مدمجة يمكن مشاركتها مباشرة مع مستهلكي API الذين لا يستخدمون Bruno.&lt;/p&gt;

&lt;p&gt;لذلك تلجأ الفرق عادة إلى حلول إضافية مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تصدير مجموعة Bruno أو تحويلها إلى OpenAPI.&lt;/li&gt;
&lt;li&gt;استخدام مولد توثيق ثابت.&lt;/li&gt;
&lt;li&gt;بناء موقع توثيق داخل CI/CD.&lt;/li&gt;
&lt;li&gt;كتابة README يدويًا.&lt;/li&gt;
&lt;li&gt;تحديث ملفات Markdown منفصلة بجانب الطلبات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذه الحلول ممكنة، لكنها تضيف مسار عمل جديدًا يجب صيانته. والأسوأ أنها تنشئ مكانًا ثانيًا يمكن أن ينحرف عن حالة API الفعلية.&lt;/p&gt;

&lt;h2&gt;
  
  
  استخدم مبدأ “المستندات كتعليمات برمجية”
&lt;/h2&gt;

&lt;p&gt;الطريقة الأكثر استقرارًا هي التعامل مع التوثيق كناتج من مواصفات API، وليس كملف منفصل يتم تحديثه يدويًا.&lt;/p&gt;

&lt;p&gt;في سير عمل &lt;a href="https://apidog.com/ar/blog/api-spec-as-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;المستندات كتعليمات برمجية&lt;/a&gt;، يتم وصف API مرة واحدة في مواصفات قابلة للقراءة آليًا، غالبًا OpenAPI. بعدها يمكن استخدام نفس المواصفات لإنشاء:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التوثيق.&lt;/li&gt;
&lt;li&gt;الخوادم الوهمية.&lt;/li&gt;
&lt;li&gt;الاختبارات.&lt;/li&gt;
&lt;li&gt;أمثلة الطلبات.&lt;/li&gt;
&lt;li&gt;SDKs أو تعريفات العملاء عند الحاجة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الفكرة العملية هي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAPI Spec
    ├── Documentation
    ├── Mock Server
    ├── Tests
    └── Client SDKs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بدلًا من تحديث التوثيق يدويًا، يتم تحديث المواصفات. ثم تُبنى المستندات منها.&lt;/p&gt;

&lt;h2&gt;
  
  
  أنشئ التوثيق من OpenAPI بدلًا من الاعتماد على ملفات منفصلة
&lt;/h2&gt;

&lt;p&gt;إذا كان هدفك نشر توثيق API قابل للمشاركة، فابدأ من مواصفات OpenAPI. يمكن أن تأتي هذه المواصفات من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مشروعك مباشرة.&lt;/li&gt;
&lt;li&gt;ملف OpenAPI موجود في Git.&lt;/li&gt;
&lt;li&gt;تصدير من أداة API.&lt;/li&gt;
&lt;li&gt;تحويل من مجموعة Bruno إذا كان ذلك مناسبًا لسير عملك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذه هي الفجوة التي تم بناء &lt;a href="https://apidog.com/ar/blog/bruno-alternative-all-in-one-api-platform?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; لسدها: إنشاء توثيق تفاعلي ومستضاف من المواصفات، بدون الحاجة إلى بناء مولد توثيق منفصل يدويًا.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-34.png" alt="" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;عند استيراد مواصفات OpenAPI إلى Apidog، يمكن إنشاء بوابة توثيق تحتوي على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;رابط مستضاف قابل للمشاركة.&lt;/li&gt;
&lt;li&gt;دعم نطاق مخصص مثل &lt;code&gt;docs.yourcompany.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;لوحة “جرّبها” لإرسال طلبات فعلية.&lt;/li&gt;
&lt;li&gt;توثيق منشأ من المواصفات بدل محتوى يدوي منفصل.&lt;/li&gt;
&lt;li&gt;نفس مصدر الحقيقة المستخدم للاختبار والمحاكاة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  خطوات عملية: من OpenAPI إلى رابط توثيق قابل للمشاركة
&lt;/h2&gt;

&lt;p&gt;استخدم الخطوات التالية إذا كان لديك ملف OpenAPI وتريد نشر توثيق قابل للاستخدام:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الخطوة&lt;/th&gt;
&lt;th&gt;الإجراء&lt;/th&gt;
&lt;th&gt;النتيجة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;استورد أو اكتب مواصفات OpenAPI الخاصة بك في Apidog&lt;/td&gt;
&lt;td&gt;تُملأ نقاط النهاية والمخططات والأمثلة تلقائيًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;افتح إعدادات توثيق المشروع&lt;/td&gt;
&lt;td&gt;تُنشأ المستندات من المواصفات وتصبح جاهزة للتكوين&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;اختر مستوى الرؤية و، اختياريًا، نطاقًا مخصصًا&lt;/td&gt;
&lt;td&gt;يمكن جعل المستندات عامة أو خاصة أو محمية بكلمة مرور&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;انشر التوثيق&lt;/td&gt;
&lt;td&gt;يتم إنشاء موقع مستندات مباشر ومستضاف بعنوان URL ثابت&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;شارك الرابط مع الفريق أو المستهلكين&lt;/td&gt;
&lt;td&gt;يمكنهم قراءة المستندات وتجربة الطلبات من المتصفح&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  مثال OpenAPI بسيط يمكن استخدامه كنقطة بداية
&lt;/h2&gt;

&lt;p&gt;إذا لم تكن لديك مواصفات جاهزة، يمكنك البدء بملف صغير مثل هذا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.example.com&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;الحصول على مستخدم حسب المعرّف&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;تم العثور على المستخدم&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد استيراد هذا الملف، يجب أن يظهر المسار &lt;code&gt;/users/{id}&lt;/code&gt; في التوثيق مع المعلمة &lt;code&gt;id&lt;/code&gt; ومخطط الاستجابة.&lt;/p&gt;

&lt;h2&gt;
  
  
  إذا كنت تستخدم Bruno بالفعل
&lt;/h2&gt;

&lt;p&gt;لا تحتاج إلى التخلي عن Bruno فورًا. يمكنك استخدامه كأداة تشغيل طلبات داخلية، ثم تحويل أو تصدير العقد إلى OpenAPI عند الحاجة إلى نشر التوثيق.&lt;/p&gt;

&lt;p&gt;سير عمل عملي يمكن أن يبدو هكذا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bruno Collection
      ↓
OpenAPI Spec
      ↓
Apidog Documentation
      ↓
Public or Private Docs URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;النقطة المهمة هي أن النشر يجب أن يعتمد على المواصفات، وليس على README منفصل أو تحديثات يدوية متفرقة.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تحافظ على تزامن التوثيق مع API؟
&lt;/h2&gt;

&lt;p&gt;أكبر مشكلة في التوثيق اليدوي هي النسيان. قد يغير أحد المطورين نقطة نهاية أو يضيف حقلًا جديدًا في الاستجابة، ثم لا يتم تحديث المستندات.&lt;/p&gt;

&lt;p&gt;لتقليل هذا الخطر:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اجعل OpenAPI هو مصدر الحقيقة.&lt;/li&gt;
&lt;li&gt;خزّن المواصفات في Git.&lt;/li&gt;
&lt;li&gt;راجع تغييرات المواصفات في Pull Requests.&lt;/li&gt;
&lt;li&gt;انشر التوثيق من المواصفات نفسها.&lt;/li&gt;
&lt;li&gt;لا تكتب وصفًا موازيًا لنفس العقد في ملفات منفصلة إلا عند الحاجة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال على تغيير يجب أن يظهر في Pull Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; properties:
   id:
     type: string
   name:
     type: string
&lt;span class="gi"&gt;+  role:
+    type: string
+    enum: [admin, user]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;عندما يكون التوثيق منشأ من المواصفات، فإن إضافة &lt;code&gt;role&lt;/code&gt; إلى مخطط الاستجابة تنعكس في صفحة التوثيق بدل الحاجة إلى تحديثها يدويًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى يكون Bruno كافيًا؟
&lt;/h2&gt;

&lt;p&gt;Bruno مناسب إذا كان التوثيق موجهًا لفريق داخلي يستخدم نفس المستودع ونفس الأداة. مثلًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فريق backend صغير.&lt;/li&gt;
&lt;li&gt;كل أعضاء الفريق يملكون وصولًا إلى Git.&lt;/li&gt;
&lt;li&gt;التوثيق المطلوب هو ملاحظات داخلية حول الطلبات.&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى رابط عام أو بوابة مستضافة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في هذه الحالة، ملفات &lt;code&gt;.bru&lt;/code&gt; مع كتل &lt;code&gt;docs&lt;/code&gt; قد تكون كافية.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تحتاج إلى بوابة توثيق مستضافة؟
&lt;/h2&gt;

&lt;p&gt;ستحتاج إلى حل توثيق منشور عندما يكون لديك:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فريق frontend لا يريد تثبيت عميل API.&lt;/li&gt;
&lt;li&gt;شركاء خارجيون يحتاجون إلى مرجع API.&lt;/li&gt;
&lt;li&gt;فريق QA يحتاج إلى تجربة الطلبات من المتصفح.&lt;/li&gt;
&lt;li&gt;عملاء يحتاجون إلى رابط مستندات.&lt;/li&gt;
&lt;li&gt;نطاق مخصص للتوثيق.&lt;/li&gt;
&lt;li&gt;حاجة إلى “جرّبها” داخل صفحة المستندات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هنا يصبح إنشاء التوثيق من OpenAPI ونشره كعنوان URL ثابت أكثر عملية من الاعتماد على ملفات Bruno وحدها.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل يمكن لـ Bruno إنشاء واستضافة توثيق API عام؟
&lt;/h3&gt;

&lt;p&gt;يوفر Bruno ملفات &lt;code&gt;.bru&lt;/code&gt; قابلة للقراءة، ويدعم توثيق Markdown داخل التطبيق، ويمكن حفظ كل ذلك في Git. لكنه لا يتضمن بوابة توثيق عامة مدمجة ومستضافة تلقائيًا بعنوان URL قابل للمشاركة. لنشر مستندات عامة، تحتاج عادة إلى تصدير أو تحويل المواصفات واستخدام أداة توثيق منفصلة.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أحصل على رابط توثيق قابل للمشاركة؟
&lt;/h3&gt;

&lt;p&gt;اكتب أو استورد مواصفات OpenAPI، ثم استخدم أداة تنشئ مستندات مستضافة منها. في Apidog، يمكنك استيراد المواصفات، ضبط مستوى الرؤية، إضافة نطاق مخصص اختياريًا، ثم نشر التوثيق للحصول على رابط ثابت.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يجب أن أترك Bruno لنشر المستندات؟
&lt;/h3&gt;

&lt;p&gt;لا. يمكنك الاستمرار في استخدام Bruno لتشغيل الطلبات داخليًا، واستخدام OpenAPI كطبقة مواصفات للنشر. الفكرة هي أن يتم إنشاء التوثيق من العقد نفسه، سواء بدأت من Bruno أو من ملف OpenAPI مباشر.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما أفضل مصدر حقيقة للتوثيق؟
&lt;/h3&gt;

&lt;p&gt;أفضل مصدر حقيقة هو مواصفات API القابلة للمراجعة، مثل OpenAPI. إذا كانت المواصفات في Git وتخضع للمراجعة، يمكن توليد التوثيق منها باستمرار وتقليل الانحراف بين API الفعلي والمستندات.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;Bruno ممتاز كعميل API يعتمد على Git وملفات نصية، لكنه ليس حلًا كاملًا لنشر بوابة توثيق API عامة. إذا كان هدفك إرسال رابط مستندات قابل للمشاركة، استخدم مواصفات OpenAPI كمصدر حقيقة، ثم أنشئ التوثيق المستضاف منها.&lt;/p&gt;

&lt;p&gt;بهذا تحصل على سير عمل أوضح:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;اكتب العقد مرة واحدة → راجعه في Git → أنشئ التوثيق منه → شارك الرابط
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وهذا يقلل التحديثات اليدوية، ويحافظ على دقة المستندات، ويجعل API أسهل للاستهلاك من قبل الفرق الداخلية والخارجية.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هل برونو أسلوب الطلب أولاً؟ متى تحتاج أداة تصميم أولاً</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 08:11:58 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/hl-brwnw-slwb-ltlb-wlan-mt-thtj-d-tsmym-wlan-4l5j</link>
      <guid>https://dev.to/yusuf_khalidd/hl-brwnw-slwb-ltlb-wlan-mt-thtj-d-tsmym-wlan-4l5j</guid>
      <description>&lt;p&gt;هل برونو يعتمد على الطلبات أولاً؟ نعم. برونو مبني حول إنشاء طلبات HTTP وتنظيمها وإرسالها، ثم تخزينها كملفات &lt;code&gt;.bru&lt;/code&gt; يمكن تتبعها في Git. هذا مناسب جدًا عندما تستكشف API موجودة، لكنه يختلف عن نهج التصميم أولاً الذي يبدأ بتعريف عقد OpenAPI قبل تنفيذ الخادم.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  الطلبات أولاً مقابل التصميم أولاً، باختصار
&lt;/h2&gt;

&lt;p&gt;النهجان لا يحلان المشكلة نفسها:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;الطلبات أولاً&lt;/strong&gt; يسأل: كيف أستدعي نقطة النهاية هذه؟&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;التصميم أولاً&lt;/strong&gt; يسأل: كيف يجب أن تبدو نقطة النهاية قبل أن يكتب أي فريق الكود؟&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;البعد&lt;/th&gt;
&lt;th&gt;الطلبات أولاً (برونو)&lt;/th&gt;
&lt;th&gt;التصميم أولاً (مبني على OpenAPI)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;القطعة الأولية&lt;/td&gt;
&lt;td&gt;طلب يمكنك إرساله&lt;/td&gt;
&lt;td&gt;عقد API عبر مواصفات OpenAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;الأفضل لـ&lt;/td&gt;
&lt;td&gt;استكشاف واختبار APIs موجودة&lt;/td&gt;
&lt;td&gt;تصميم APIs جديدة أو مشتركة قبل التنفيذ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مصدر الحقيقة&lt;/td&gt;
&lt;td&gt;مجموعة الطلبات&lt;/td&gt;
&lt;td&gt;المواصفات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مراجعة متعددة الفرق&lt;/td&gt;
&lt;td&gt;غالبًا بعد وجود نقاط النهاية&lt;/td&gt;
&lt;td&gt;قبل كتابة كود الخادم&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;واجهة تصميم مرئية&lt;/td&gt;
&lt;td&gt;غير موجودة افتراضيًا&lt;/td&gt;
&lt;td&gt;مصمم مرئي + محرر مخطط&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;خطر الانجراف&lt;/td&gt;
&lt;td&gt;قد تتأخر المجموعة عن API الحقيقية&lt;/td&gt;
&lt;td&gt;المواصفات تبقى العقد المرجعي&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;قصة Git&lt;/td&gt;
&lt;td&gt;قوية عبر ملفات &lt;code&gt;.bru&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;قوية عندما تتم مزامنة المواصفات مع Git&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;الاختيار العملي يعتمد على المرحلة: هل الـ API موجودة وتريد اختبارها؟ أم أنك تصمم عقدًا سيعتمد عليه أكثر من فريق؟&lt;/p&gt;

&lt;h2&gt;
  
  
  نموذج برونو للطلبات أولاً
&lt;/h2&gt;

&lt;p&gt;برونو يؤدي دور عميل API محلي أولاً. الطلبات تُحفظ كملفات نصية &lt;code&gt;.bru&lt;/code&gt; داخل مجلد تملكه، ويمكن مراجعتها ودمجها مثل بقية ملفات المشروع. هذا هو جوهر &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل واجهة برمجة التطبيقات الأصيل لـ Git&lt;/a&gt; الذي تفضله فرق كثيرة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jc2i7x6pjyd50d6x7z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0jc2i7x6pjyd50d6x7z5.png" alt="واجهة برونو" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;مثال مبسط لفكرة الطلب المخزن كملف نصي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meta {
  name: Get user
  type: http
}

get {
  url: https://api.example.com/users/123
  body: none
  auth: none
}

headers {
  Accept: application/json
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا النموذج عملي عندما يكون الهدف هو:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;فتح خدمة تعمل بالفعل.&lt;/li&gt;
&lt;li&gt;إرسال طلبات HTTP بسرعة.&lt;/li&gt;
&lt;li&gt;فحص الاستجابة.&lt;/li&gt;
&lt;li&gt;إضافة assertions أو scripts.&lt;/li&gt;
&lt;li&gt;تتبع التغييرات في Git.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;حيث يتألق برونو:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;استكشاف API موجودة&lt;/strong&gt;: وجّه الطلب إلى خدمة قيد التشغيل، أرسل، افحص، وكرر.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;محلي أولاً ومتوافق مع Git&lt;/strong&gt;: الفروقات قابلة للقراءة، والطلبات تعيش بجانب الكود.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;البرمجة النصية والاختبار&lt;/strong&gt;: يمكن استخدام scripts قبل/بعد الطلب، متغيرات بيئية، وتأكيدات.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ملكية الملفات&lt;/strong&gt;: التنسيق نصي والملفات تحت سيطرتك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كان عملك الأساسي هو استهلاك APIs موجودة والتحقق منها، فالطلبات أولاً غالبًا هو المسار الأقصر. ناقشنا هذا أيضًا في &lt;a href="https://apidog.com/ar/blog/bruno-alternative-all-in-one-api-platform?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;هذا التحليل البديل لبرونو&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  تكلفة عدم وجود طبقة تصميم أو عقد
&lt;/h2&gt;

&lt;p&gt;تظهر حدود الطلبات أولاً عندما لا تكون الـ API موجودة بعد، أو عندما يحتاج أكثر من فريق إلى الاتفاق على شكلها قبل التنفيذ.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. لا يوجد نموذج تصميم مركزي
&lt;/h3&gt;

&lt;p&gt;في أدوات الطلبات أولاً، نقطة البداية هي طلب HTTP، مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users
Content-Type: application/json

{
  "name": "Ali",
  "email": "ali@example.com"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يوضح مثالًا على الاستدعاء، لكنه لا يعرّف بالضرورة العقد الكامل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ما الحقول المطلوبة؟&lt;/li&gt;
&lt;li&gt;ما نوع كل حقل؟&lt;/li&gt;
&lt;li&gt;ما شكل الخطأ؟&lt;/li&gt;
&lt;li&gt;ما الاستجابات الممكنة؟&lt;/li&gt;
&lt;li&gt;هل &lt;code&gt;email&lt;/code&gt; يجب أن يكون فريدًا؟&lt;/li&gt;
&lt;li&gt;هل هناك pagination أو filtering؟&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في التصميم أولاً، تُعرّف هذه التفاصيل في OpenAPI قبل التنفيذ.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. خطر انجراف العقد
&lt;/h3&gt;

&lt;p&gt;عندما تكون مجموعة الطلبات هي مصدر الحقيقة، فهي تعكس ما تم استدعاؤه فقط. يمكن أن تتغير API الحقيقية بإضافة حقل أو إزالة باراميتر أو تشديد validation، بينما تبقى المجموعة قديمة إلى أن يفشل اختبار أو يلاحظ مطور المشكلة.&lt;/p&gt;

&lt;p&gt;أما في سير عمل مبني على المواصفات، فالعقد هو المرجع:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1.0&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/CreateUserRequest"&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User created&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;400"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Invalid request&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;CreateUserRequest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الملف يوضح البنية التي يجب أن يلتزم بها التنفيذ والعملاء.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. مراجعة أصعب قبل كتابة الكود
&lt;/h3&gt;

&lt;p&gt;مراجعة مجلد طلبات تخبرك كيف تُستدعى endpoints اليوم. لكنها ليست دائمًا أفضل طريقة للموافقة على تصميم API قبل التنفيذ.&lt;/p&gt;

&lt;p&gt;في فرق متعددة، تحتاج عادةً إلى مراجعة واضحة لـ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;الموارد.&lt;/li&gt;
&lt;li&gt;المسارات.&lt;/li&gt;
&lt;li&gt;schemas.&lt;/li&gt;
&lt;li&gt;status codes.&lt;/li&gt;
&lt;li&gt;errors.&lt;/li&gt;
&lt;li&gt;versioning.&lt;/li&gt;
&lt;li&gt;breaking changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا أسهل عندما يكون هناك عقد OpenAPI من الدرجة الأولى.&lt;/p&gt;

&lt;p&gt;برونو ليس أداة سيئة بسبب ذلك؛ هو ببساطة أداة طلبات أولاً، وتصبح حدوده أوضح عندما تستخدمه لتصميم عقود APIs جديدة.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى يفوز نهج التصميم أولاً
&lt;/h2&gt;

&lt;p&gt;نهج التصميم أولاً مفيد خصوصًا في الحالات التالية.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. APIs جديدة تمامًا
&lt;/h3&gt;

&lt;p&gt;عندما لا يوجد implementation بعد، ابدأ بالمواصفات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{orderId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get order by ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orderId&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order found&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد الاتفاق على العقد، يمكن للفرق استخدامه كأساس للتوثيق، mocks، ومراجعة التصميم.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. عقود بين أكثر من فريق
&lt;/h3&gt;

&lt;p&gt;إذا كان فريق الواجهة الخلفية وفريق الواجهة الأمامية يعملان بالتوازي، فإن OpenAPI يصبح نقطة الاتفاق.&lt;/p&gt;

&lt;p&gt;سير عمل عملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;صمّم endpoint في OpenAPI.&lt;/li&gt;
&lt;li&gt;راجع العقد في Pull Request.&lt;/li&gt;
&lt;li&gt;وافق الفريقان على الشكل.&lt;/li&gt;
&lt;li&gt;يبدأ فريق الواجهة الأمامية بالعمل مقابل mock أو contract.&lt;/li&gt;
&lt;li&gt;ينفذ فريق الواجهة الخلفية نفس العقد.&lt;/li&gt;
&lt;li&gt;تُختبر الاستجابة الفعلية مقابل المواصفات.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. APIs عامة
&lt;/h3&gt;

&lt;p&gt;عندما يعتمد مطورون خارجيون على API، يصبح العقد والتوثيق جزءًا من المنتج. وجود مواصفات محافظة عليها يساعد في:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;توثيق endpoints.&lt;/li&gt;
&lt;li&gt;توضيح breaking changes.&lt;/li&gt;
&lt;li&gt;توحيد status codes.&lt;/li&gt;
&lt;li&gt;تقليل الغموض في التكامل.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkexgdoz7ftdrgj4fz4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkexgdoz7ftdrgj4fz4y.png" alt="تصميم API" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الخلاصة: يفوز التصميم أولاً عندما تكون API واجهة مشتركة تحتاج إلى اتفاق قبل الكود، وليس مجرد خدمة تستكشفها بعد إطلاقها.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog: تصميم أولاً بالإضافة إلى وضع المواصفات أولاً
&lt;/h2&gt;

&lt;p&gt;تم تصميم Apidog لدعم سير عمل التصميم أولاً، مع الحفاظ على تجربة OpenAPI وGit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zq03ht6aku8ch1e2elk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zq03ht6aku8ch1e2elk.png" alt="Apidog design first" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;يمكنك العمل بطريقتين على نفس المشروع:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;مصمم مرئي&lt;/strong&gt; لتحديد endpoints، مخططات الطلبات والاستجابات، والمكونات القابلة لإعادة الاستخدام دون كتابة YAML يدويًا.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;وضع المواصفات أولاً&lt;/strong&gt; لكتابة مستند OpenAPI مباشرة كمصدر الحقيقة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الفكرة العملية هنا أن المصمم المرئي ومحرر المواصفات يبقيان العقد نفسه متزامنًا. يمكن لمهندس الخلفية العمل على OpenAPI الخام، بينما يراجع عضو آخر التصميم بصريًا.&lt;/p&gt;

&lt;p&gt;مثال على سير عمل قابل للتطبيق:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. ابدأ بتعريف المسار /users في OpenAPI.
2. أضف schema للطلب والاستجابة.
3. راجع العقد مع فريق الواجهة الأمامية.
4. اربط المواصفات مع Git.
5. مرر التعديل عبر Pull Request.
6. بعد الموافقة، ابدأ التنفيذ والاختبار بناءً على العقد.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يدعم وضع المواصفات أولاً أيضًا مزامنة Git ثنائية الاتجاه: تعيش المواصفات في المستودع كملف حقيقي، وتتدفق التغييرات في كلا الاتجاهين، ويمر تصميم API عبر نفس Pull Requests والمراجعات مثل الكود. هذه هي الخاصية الأصلية لـ Git التي يقدّرها مستخدمو برونو، لكنها تُطبّق على العقد بدل مجموعة الطلبات. التفاصيل موجودة في &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وثائق وضع المواصفات أولاً&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt6a21sr9mfx2ddp3qxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt6a21sr9mfx2ddp3qxw.png" alt="Spec-first mode" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;النتيجة هي سير عمل يغطي السؤالين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;صمّم العقد أولاً عندما تحتاج إلى اتفاق قبل التنفيذ.&lt;/li&gt;
&lt;li&gt;اختبر الطلبات لاحقًا عندما تصبح endpoints متاحة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للمزيد حول نقطة التقاء هذه النماذج، راجع &lt;a href="https://apidog.com/ar/blog/spec-first-vs-design-first-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;المواصفات أولاً مقابل التصميم أولاً في Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الاختيار حسب نضج الفريق
&lt;/h2&gt;

&lt;p&gt;طريقة عملية لاتخاذ القرار: طابق الأداة مع مرحلة API في دورة حياتها.&lt;/p&gt;

&lt;h3&gt;
  
  
  استخدم الطلبات أولاً عندما:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;تعمل بمفردك أو ضمن فريق صغير.&lt;/li&gt;
&lt;li&gt;تستهلك APIs موجودة في الغالب.&lt;/li&gt;
&lt;li&gt;تحتاج إلى إرسال الطلبات بسرعة.&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى عقد رسمي قبل التنفيذ.&lt;/li&gt;
&lt;li&gt;تريد ملفات محلية سهلة التتبع في Git.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  انتقل إلى التصميم أولاً عندما:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;تبني API جديدة.&lt;/li&gt;
&lt;li&gt;يعتمد فريق آخر على endpoints الخاصة بك.&lt;/li&gt;
&lt;li&gt;تحتاج إلى مراجعة تصميم قبل الكود.&lt;/li&gt;
&lt;li&gt;تريد توثيقًا واضحًا من العقد.&lt;/li&gt;
&lt;li&gt;تريد تقليل أخطاء التكامل الناتجة عن الغموض.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  في مؤسسة أكبر
&lt;/h3&gt;

&lt;p&gt;عندما تمتلك المؤسسة APIs عامة أو داخلية كثيرة، يصبح التصميم أولاً أقرب إلى ضرورة تشغيلية. المواصفات تعمل كـ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;عقد.&lt;/li&gt;
&lt;li&gt;توثيق.&lt;/li&gt;
&lt;li&gt;أداة مراجعة.&lt;/li&gt;
&lt;li&gt;مرجع للفرق.&lt;/li&gt;
&lt;li&gt;آلية حوكمة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;القراءة العملية للمقارنة بين برونو والتصميم أولاً هي أن النضج، لا الذوق فقط، هو العامل الحاسم. تبدأ فرق كثيرة بالطلبات أولاً، ثم تنتقل إلى التصميم أولاً عندما تتحول APIs إلى عقود يعتمد عليها الآخرون.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل برونو يعتمد على الطلبات أولاً أم التصميم أولاً؟
&lt;/h3&gt;

&lt;p&gt;برونو يعتمد على الطلبات أولاً. نموذجه الأساسي هو إنشاء الطلبات وتنظيمها وإرسالها، مع تخزينها كملفات نصية عادية. هذا مناسب لاستكشاف APIs الموجودة واختبارها، لكنه لا يركز على تأليف عقد OpenAPI قبل بناء API.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني القيام بعمل تصميم أولاً في برونو؟
&lt;/h3&gt;

&lt;p&gt;ليس بشكل أصلي مثل أداة تركز على المواصفات. برونو يركز على الطلبات بدل المصمم المرئي أو مستند OpenAPI كمصدر الحقيقة. إذا كنت بحاجة إلى تعريف عقد ومراجعته قبل الكود، فإن أداة تصميم أولاً مبنية على OpenAPI ستكون أنسب.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يجب أن أتخلى عن Git للانتقال إلى التصميم أولاً؟
&lt;/h3&gt;

&lt;p&gt;لا. يمكن تطبيق نموذج Git، الملفات النصية، الفروقات القابلة للقراءة، والمراجعة عبر Pull Requests على المواصفات نفسها. وضع المواصفات أولاً في Apidog يحافظ على مستند OpenAPI داخل المستودع بمزامنة ثنائية الاتجاه، لذلك لا يعني التصميم أولاً التخلي عن Git.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>كيفية مزامنة مواصفات OpenAPI مع GitHub بطريقتين</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:44:50 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-mzmn-mwsft-openapi-m-github-btryqtyn-10k0</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-mzmn-mwsft-openapi-m-github-btryqtyn-10k0</guid>
      <description>&lt;p&gt;إذا كان مستند OpenAPI الخاص بك موجودًا في مستودع Git، لكنك تعدّله داخل عميل API، فالمشكلة مألوفة: تنسخ YAML، تلصقه مرة أخرى، تتمنى ألا يكون أحد عدّل الملف، ثم تكتشف لاحقًا أن الاستيراد أو التصدير أسقط حقلًا أو غيّر التنسيق. الحل العملي هو جعل المستودع مصدر الحقيقة، ومزامنة التحرير مباشرة معه بدل إدارة نسختين من نفس المواصفة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في هذا الدليل ستتعلم كيف تزامن مواصفات OpenAPI مع GitHub باستخدام وضع Spec-First في Apidog. سنربط مزود Git، نفتح مشروعًا من مستودع وفرع، نعدّل ملف YAML، ثم ندفع التغيير إلى GitHub من داخل Apidog. نفس التدفق يعمل أيضًا مع GitLab، ويدعم Azure DevOps عبر اتصال Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا تعني المزامنة ثنائية الاتجاه عمليًا؟
&lt;/h2&gt;

&lt;p&gt;المزامنة ثنائية الاتجاه تعني أن ملف OpenAPI يتحرك في الاتجاهين بدون خطوة تصدير/استيراد يدوية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;من Apidog إلى Git&lt;/strong&gt;: تعدّل المواصفة داخل Apidog، ثم تنفّذ &lt;code&gt;Commit &amp;amp; Push&lt;/code&gt; ليصل التغيير إلى الفرع المحدد في المستودع.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;من Git إلى Apidog&lt;/strong&gt;: إذا دفع أحد أعضاء الفريق تعديلًا إلى نفس الفرع، يسحب Apidog التغيير ويحدّث المحرر.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بهذا يبقى المستودع هو مصدر الحقيقة الوحيد، بينما يعمل Apidog كمحرر غني فوق ملف OpenAPI نفسه. هذا هو جوهر &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل API الأصلي لـ Git&lt;/a&gt;: المواصفات تُراجع وتُؤرشف وتُدار مثل أي ملف آخر في قاعدة الكود.&lt;/p&gt;

&lt;h2&gt;
  
  
  المتطلبات الأساسية
&lt;/h2&gt;

&lt;p&gt;قبل البدء، تأكد من توفر التالي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;حساب Apidog وتسجيل الدخول من تطبيق سطح المكتب أو الويب.&lt;/li&gt;
&lt;li&gt;مستودع GitHub أو GitLab يحتوي على ملف OpenAPI، مثل:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openapi.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openapi.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs/openapi.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;صلاحية كتابة على الفرع الذي ستزامن معه.&lt;/li&gt;

&lt;li&gt;تفعيل وضع &lt;strong&gt;Spec-First (Beta)&lt;/strong&gt; في Apidog.&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;إذا كان لديك وصول قراءة فقط، يمكنك سحب المواصفة وفتحها، لكنك لن تتمكن من دفع التعديلات إلى المستودع.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  الخطوة 1: ربط مزود Git
&lt;/h2&gt;

&lt;p&gt;ابدأ بتخويل Apidog للوصول إلى مزود Git الخاص بك.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح Apidog.&lt;/li&gt;
&lt;li&gt;أنشئ مشروعًا جديدًا.&lt;/li&gt;
&lt;li&gt;اختر وضع &lt;strong&gt;Spec-First&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;عند اختيار المصدر، حدد:

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;أو GitLab&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;اضغط &lt;strong&gt;Authorize&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;سيُفتح متصفحك على شاشة OAuth الخاصة بالمزود.&lt;/li&gt;
&lt;li&gt;امنح Apidog صلاحية الوصول إلى المستودعات المطلوبة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;على GitHub، يمكنك تقييد الوصول لمستودعات محددة بدل منح الوصول لكل الحساب.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-26.png" alt="" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;بعد اكتمال التخويل، ستعود إلى Apidog ويصبح مزود Git متصلًا. تحتاج إلى تنفيذ هذه الخطوة مرة واحدة فقط لكل مزود، وبعدها يمكن للمشاريع الجديدة إعادة استخدام الاتصال.&lt;/p&gt;

&lt;p&gt;للمرجع الكامل، بما في ذلك Azure DevOps عبر اتصال Git، راجع &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وثائق وضع Spec-First&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 2: إنشاء مشروع من مستودع وفرع
&lt;/h2&gt;

&lt;p&gt;بعد ربط GitHub أو GitLab، اربط المشروع بملف OpenAPI الفعلي.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اختر المستودع الذي يحتوي على المواصفة.&lt;/li&gt;
&lt;li&gt;اختر الفرع الذي تريد المزامنة معه، مثل:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;develop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature/openapi-update&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;حدد مسار ملف OpenAPI إذا طلب Apidog ذلك، مثل:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;أنشئ المشروع.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-29.png" alt="" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;سيقرأ Apidog الملف من الفرع المحدد ويفتحه داخل المحرر. في الشريط الجانبي، ستظهر المسارات والمخططات لأن Apidog يحلل ملف OpenAPI ويحوّله إلى بنية قابلة للتصفح.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 3: تعديل ملف OpenAPI YAML
&lt;/h2&gt;

&lt;p&gt;في وضع Spec-First، تعدّل ملف OpenAPI الخام مباشرة داخل محرر شبيه بـ IDE. تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تمييز صياغة YAML.&lt;/li&gt;
&lt;li&gt;تحقق مضمّن من الأخطاء.&lt;/li&gt;
&lt;li&gt;إكمال تلقائي.&lt;/li&gt;
&lt;li&gt;تحديث فوري للشجرة المرئية للمسارات والمخططات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لنضف endpoint بسيطًا لفحص حالة الخدمة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service health check&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;getHealth&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service is up&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                    &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ok&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أثناء الكتابة، راقب نقطتين:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;تظهر عملية &lt;code&gt;/health&lt;/code&gt; في الشريط الجانبي عند تحليل المواصفة.&lt;/li&gt;
&lt;li&gt;إذا كان هناك خطأ مثل مسافة بادئة غير صحيحة، أو &lt;code&gt;responses&lt;/code&gt; مفقودة، أو &lt;code&gt;$ref&lt;/code&gt; غير صالح، سيشير المحرر إلى المشكلة قبل الالتزام.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال على خطأ شائع في YAML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service health check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في المثال السابق، &lt;code&gt;get&lt;/code&gt; ليست متداخلة بشكل صحيح تحت &lt;code&gt;/health&lt;/code&gt;. الصيغة الصحيحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service health check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تريد فهمًا أعمق لكيفية استخدام Git مع فروقات وتاريخ مواصفات OpenAPI، راجع دليل &lt;a href="https://apidog.com/ar/blog/openapi-version-control-with-git?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;التحكم في إصدار OpenAPI باستخدام Git&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 4: الالتزام والدفع إلى GitHub
&lt;/h2&gt;

&lt;p&gt;بعد الانتهاء من التعديل، ادفع التغيير إلى المستودع.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح لوحة Git أو Source Control داخل المشروع.&lt;/li&gt;
&lt;li&gt;راجع التغييرات المعروضة.&lt;/li&gt;
&lt;li&gt;اكتب رسالة التزام واضحة، مثل:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add /health endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;اضغط &lt;strong&gt;Commit &amp;amp; Push&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-27.png" alt="" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;سينشئ Apidog التزامًا على الفرع الذي اخترته، ثم يدفعه إلى المستودع البعيد. افتح GitHub وستجد الالتزام في سجل الفرع، ويؤثر على ملف OpenAPI المحدد.&lt;/p&gt;

&lt;p&gt;إذا غيّرت رأيك قبل الدفع، يمكنك تجاهل التعديلات غير المدفوعة وإعادة الملف إلى آخر حالة مزامنة. طالما لم تضغط &lt;strong&gt;Commit &amp;amp; Push&lt;/strong&gt;، تبقى التعديلات محلية.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 5: التحقق من حالة المزامنة
&lt;/h2&gt;

&lt;p&gt;يعرض Apidog مؤشرًا لحالة المزامنة حتى تعرف هل المحرر والفرع البعيد متطابقان أم لا.&lt;/p&gt;

&lt;p&gt;بعد الدفع الناجح، سترى حالة مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Synced just now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يعني أن ملف OpenAPI في Apidog يطابق الملف الموجود في الفرع البعيد.&lt;/p&gt;

&lt;p&gt;مع مرور الوقت قد تظهر حالة مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Synced 5 minutes ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وإذا دفع شخص آخر تعديلًا إلى نفس الفرع، يسحب Apidog التغيير ويحدّث المؤشر بعد المزامنة.&lt;/p&gt;

&lt;p&gt;إذا ظهرت حالة معلقة أو قديمة، فهذا يعني أن النسخة المحلية والبعيدة تباعدتا. في هذه الحالة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اسحب آخر التغييرات.&lt;/li&gt;
&lt;li&gt;راجع الفروقات.&lt;/li&gt;
&lt;li&gt;حل أي تعارضات.&lt;/li&gt;
&lt;li&gt;أعد تنفيذ الالتزام والدفع.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  استكشاف الأخطاء وإصلاحها
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. فشل الدفع بسبب الأذونات
&lt;/h3&gt;

&lt;p&gt;قد يحدث ذلك إذا انتهت صلاحية التخويل أو أُلغي من GitHub/GitLab.&lt;/p&gt;

&lt;p&gt;الحل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أعد تنفيذ خطوة &lt;strong&gt;Authorize&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;تأكد أن Apidog لديه صلاحية الوصول إلى المستودع.&lt;/li&gt;
&lt;li&gt;تأكد أن لديك صلاحية كتابة على الفرع.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. الفرع محمي
&lt;/h3&gt;

&lt;p&gt;إذا كان الفرع &lt;code&gt;main&lt;/code&gt; محميًا ويتطلب Pull Request، قد يتم رفض الدفع المباشر.&lt;/p&gt;

&lt;p&gt;الحلول الممكنة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;زامن مع فرع آخر مثل:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/update-openapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;أو عدّل قواعد حماية الفرع إذا كان ذلك مناسبًا لسياسة الفريق.&lt;/li&gt;
&lt;li&gt;أو استخدم Pull Request بعد دفع التغيير إلى فرع منفصل.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. تعارضات الدمج
&lt;/h3&gt;

&lt;p&gt;إذا عدّل زميلك نفس الجزء من ملف OpenAPI أثناء عملك، قد تظهر تعارضات Git.&lt;/p&gt;

&lt;p&gt;تعامل معها مثل أي ملف نصي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اسحب آخر نسخة.&lt;/li&gt;
&lt;li&gt;افتح ملف YAML.&lt;/li&gt;
&lt;li&gt;راجع المقاطع المتعارضة.&lt;/li&gt;
&lt;li&gt;اختر الصيغة الصحيحة.&lt;/li&gt;
&lt;li&gt;تأكد أن YAML صالح.&lt;/li&gt;
&lt;li&gt;نفّذ &lt;code&gt;Commit &amp;amp; Push&lt;/code&gt; مرة أخرى.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. أخطاء التحقق داخل YAML
&lt;/h3&gt;

&lt;p&gt;قد يسمح لك سير العمل بالالتزام، لكن من الأفضل إصلاح الأخطاء قبل الدفع حتى لا تكسر الوثائق أو الاختبارات أو mock servers المعتمدة على المواصفة.&lt;/p&gt;

&lt;p&gt;أخطاء شائعة يجب مراجعتها:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مسافات بادئة غير صحيحة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;operationId&lt;/code&gt; مكرر.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;schema&lt;/code&gt; غير مكتمل.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ref&lt;/code&gt; يشير إلى مسار غير موجود.&lt;/li&gt;
&lt;li&gt;نقص قسم &lt;code&gt;responses&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل تعمل المزامنة مع GitHub فقط؟
&lt;/h3&gt;

&lt;p&gt;لا. يدعم وضع Spec-First كلًا من GitHub وGitLab مباشرة، كما يدعم Azure DevOps عبر اتصال Git. التدفق نفسه يبقى ثابتًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;connect -&amp;gt; edit -&amp;gt; commit -&amp;gt; push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الاختلاف الأساسي هو شاشة التخويل الخاصة بكل مزود.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا يحدث إذا عدّل زميل في الفريق المواصفة من المستودع؟
&lt;/h3&gt;

&lt;p&gt;يسحب Apidog التغييرات إلى المحرر كجزء من المزامنة ثنائية الاتجاه. إذا كانت التعديلات في أجزاء مختلفة من الملف، يمكن دمجها بسلاسة. إذا كانت في نفس الجزء، ستحتاج إلى حل تعارض Git قياسي.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني التراجع قبل وصول التغيير إلى GitHub؟
&lt;/h3&gt;

&lt;p&gt;نعم. قبل الضغط على &lt;strong&gt;Commit &amp;amp; Push&lt;/strong&gt;، تبقى التعديلات محلية. استخدم خيار تجاهل التعديلات غير المدفوعة لإعادة المستند إلى آخر حالة مزامنة.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما أفضل طريقة لاستخدام هذا التدفق داخل فريق؟
&lt;/h3&gt;

&lt;p&gt;استخدم نفس قواعد Git التي تطبقها على الكود:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;اجعل المستودع مصدر الحقيقة.&lt;/li&gt;
&lt;li&gt;استخدم فروعًا منفصلة للتغييرات الكبيرة.&lt;/li&gt;
&lt;li&gt;راجع تعديلات OpenAPI عبر Pull Requests عند الحاجة.&lt;/li&gt;
&lt;li&gt;لا تدفع إلى فرع محمي مباشرة.&lt;/li&gt;
&lt;li&gt;أصلح أخطاء التحقق قبل الالتزام.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بهذا تصبح مواصفات API جزءًا من دورة التطوير نفسها، بدل أن تكون ملفًا منفصلًا يتم تحديثه يدويًا بعد انتهاء العمل.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>كيفية التحكم في إصدار مواصفات OpenAPI باستخدام Git</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:43:05 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-lthkm-fy-sdr-mwsft-openapi-bstkhdm-git-39l0</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-lthkm-fy-sdr-mwsft-openapi-bstkhdm-git-39l0</guid>
      <description>&lt;p&gt;مواصفات OpenAPI الخاصة بك هي عقد بين الخادم والعملاء. إذا تغيّر العقد بدون مراجعة، قد تتعطل تطبيقات العملاء، تصبح الـ mocks قديمة، وتعمل الاختبارات ضد API لم يعد موجودًا. لذلك تعامل مع &lt;code&gt;openapi.yaml&lt;/code&gt; مثل الكود: ضعه في Git، اعمل عليه عبر فروع، راجعه في Pull Requests، وشغّل التحقق الآلي عند كل تغيير.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في هذا الدليل سنبني سير عمل عملي للتحكم في إصدار OpenAPI باستخدام Git: أين تضع ملف المواصفات، كيف تنشئ فروعًا لتغييرات العقد، ماذا يراجع الفريق في Pull Request، كيف تضيف فحوصات CI، وكيف تدفع التغييرات مباشرة من Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا تتحكم في إصدار مواصفات OpenAPI؟
&lt;/h2&gt;

&lt;p&gt;المواصفات الموجودة في Wiki أو Drive مشترك لا تملك سجلًا موثوقًا. لا يمكنك معرفة من غيّر حمولة &lt;code&gt;POST /orders&lt;/code&gt; أو لماذا. Git يحل هذه المشكلة.&lt;/p&gt;

&lt;p&gt;عند وضع &lt;code&gt;openapi.yaml&lt;/code&gt; تحت التحكم في الإصدار تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;سجل تغييرات واضح&lt;/strong&gt;: كل تعديل هو commit بمؤلف وتاريخ ورسالة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تتبّع المسؤولية&lt;/strong&gt;: استخدم &lt;code&gt;git blame openapi.yaml&lt;/code&gt; لمعرفة من أضاف حقلًا أو غيّر نوعًا.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;استرجاع سريع&lt;/strong&gt;: إذا كسر merge العقد، يمكنك الرجوع إلى commit سابق.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مراجعة قبل الدمج&lt;/strong&gt;: تمر تغييرات API عبر Pull Requests بدل التعديل المباشر.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا هو أساس &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل واجهة برمجة التطبيقات الأصلي لـ Git&lt;/a&gt;: المواصفات هي كود مصدر، والكود المصدر يعيش في Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  أين تضع ملف OpenAPI داخل المستودع؟
&lt;/h2&gt;

&lt;p&gt;ابدأ ببنية بسيطة ومتوقعة. الخيار العملي لمعظم الفرق هو وضع ملف واحد داخل مجلد &lt;code&gt;api/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-service/
├── api/
│   └── openapi.yaml
├── src/
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تحتفظ بعدة إصدارات رئيسية في الوقت نفسه، افصل كل إصدار في ملف مستقل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/
├── api-v1.yaml
└── api-v2.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يساعدك على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إبقاء &lt;code&gt;api-v1.yaml&lt;/code&gt; مستقرًا للعملاء الحاليين.&lt;/li&gt;
&lt;li&gt;تطوير &lt;code&gt;api-v2.yaml&lt;/code&gt; بدون خلط تغييرات غير متوافقة.&lt;/li&gt;
&lt;li&gt;تقليل حجم الـ diff في Pull Requests.&lt;/li&gt;
&lt;li&gt;تسهيل مراجعة كل تغيير حسب الإصدار.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذه هي الفكرة العملية وراء &lt;a href="https://apidog.com/ar/blog/api-spec-as-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مواصفات API كرمز&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;اختر قاعدة واحدة ووثّقها في &lt;code&gt;README.md&lt;/code&gt;. لا تترك أكثر من ملف يدّعي أنه “المواصفات الرسمية”.&lt;/p&gt;

&lt;h2&gt;
  
  
  استراتيجية التفريع لتغييرات OpenAPI
&lt;/h2&gt;

&lt;p&gt;لا تحتاج إلى نموذج تفريع خاص بالمواصفات. استخدم نفس تدفق الكود:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git pull
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; api/add-refunds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم عدّل &lt;code&gt;api/openapi.yaml&lt;/code&gt;، شغّل التحقق، وافتح Pull Request.&lt;/p&gt;

&lt;p&gt;استخدم أسماء فروع واضحة:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;نوع التغيير&lt;/th&gt;
&lt;th&gt;النمط&lt;/th&gt;
&lt;th&gt;مثال&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;نقطة نهاية جديدة&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/add-&amp;lt;resource&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/add-refunds&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تغيير حقل&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/change-&amp;lt;resource&amp;gt;-&amp;lt;field&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/change-order-status&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تغيير جوهري&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/breaking-&amp;lt;description&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/breaking-v2-auth&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;إصلاح أو تنظيف&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/fix-&amp;lt;description&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api/fix-pagination-schema&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;البادئة &lt;code&gt;api/&lt;/code&gt; تجعل Pull Request واضحًا للمراجعين وCI: هذا التغيير يمس عقد API.&lt;/p&gt;

&lt;p&gt;للتغييرات الجوهرية، استخدم &lt;code&gt;breaking-&lt;/code&gt; صراحةً حتى يعرف الفريق أن التغيير قد يحتاج إلى إصدار رئيسي جديد أو خطة ترحيل.&lt;/p&gt;

&lt;p&gt;حافظ على الفروع قصيرة العمر. فرع مواصفات يعيش أسبوعين غالبًا سيتعارض مع تغييرات الفريق. الأفضل: تغيير منطقي واحد، Pull Request صغير، ثم merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تراجع تغييرات المواصفات في Pull Request؟
&lt;/h2&gt;

&lt;p&gt;Pull Request لمواصفات OpenAPI ليس تعديلًا شكليًا؛ إنه تغيير في العقد. راجعه مثل مراجعة كود يؤثر على المستخدمين.&lt;/p&gt;

&lt;p&gt;اكتب YAML بطريقة سهلة للمراجعة. مثال:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{orderId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get an order&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orderId&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order found&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Order"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قواعد عملية لتقليل الضوضاء في diff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;استخدم ترتيبًا ثابتًا للحقول.&lt;/li&gt;
&lt;li&gt;اجعل كل حقل في سطر مستقل.&lt;/li&gt;
&lt;li&gt;تجنّب إعادة تنسيق الملف بالكامل في نفس PR.&lt;/li&gt;
&lt;li&gt;لا تخلط تغييرات schema مع تغييرات وصفية غير ضرورية.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  قائمة مراجعة للمراجعين
&lt;/h3&gt;

&lt;p&gt;افحص هذه النقاط في كل Pull Request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;التغييرات الجوهرية&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
هل تمت إضافة حقل مطلوب؟ هل حُذف حقل من response؟ هل تغيّر نوع حقل؟ هل تمت إزالة قيمة من enum؟&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;التوافق مع الإصدارات السابقة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
إضافة endpoint جديد أو حقل اختياري غالبًا آمنة. تغيير شكل response موجود قد يكسر العملاء.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;الاتساق في التسمية&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
هل تستخدم نفس نمط الجمع، casing، وأسماء الموارد الموجودة؟&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;اكتمال العملية&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
كل operation جديدة تحتاج إلى &lt;code&gt;summary&lt;/code&gt;، responses، schemas، وأخطاء متوقعة.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;الأمثلة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
الأمثلة الواقعية تجعل الوثائق والـ mocks والاختبارات أكثر فائدة.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تعتمد فقط على العين البشرية لاكتشاف breaking changes. أضف فحص CI يقارن مواصفات PR مع &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الالتزام والدفع من Apidog
&lt;/h2&gt;

&lt;p&gt;تحرير YAML يدويًا يعمل، لكنه يصبح مزعجًا عندما تكبر المواصفات. محرر مرئي مع تحقق مباشر يقلل الأخطاء ويجعل التعديل أسرع.&lt;/p&gt;

&lt;p&gt;يوفر وضع Apidog Spec-First مزامنة Git ثنائية الاتجاه:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اربط مستودع Git.&lt;/li&gt;
&lt;li&gt;حدّد ملف المواصفات مثل &lt;code&gt;api/openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;عدّل endpoints وschemas وexamples من الواجهة.&lt;/li&gt;
&lt;li&gt;اترك Apidog يكتب YAML متناسقًا.&lt;/li&gt;
&lt;li&gt;أنشئ commit على فرعك وادفعه إلى المستودع.&lt;/li&gt;
&lt;li&gt;افتح Pull Request كالمعتاد.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-25.png" alt="لقطة شاشة لواجهة Apidog تعرض وضع Spec-First مع خيارات تحرير واجهة برمجة التطبيقات والمزامنة مع Git." width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الفائدة العملية هنا أن diff يبقى قابلًا للمراجعة: لا إعادة ترتيب عشوائية ولا إعادة تنسيق مزعجة. يمكنك قراءة الإعداد الكامل في &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وثائق وضع Apidog Spec-First&lt;/a&gt;. وإذا كنت تريد مزامنة الملف مع GitHub تحديدًا، راجع &lt;a href="https://apidog.com/ar/blog/sync-openapi-spec-to-github?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مزامنة مواصفات OpenAPI الخاصة بك مع GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  أضف فحوصات CI لمواصفات OpenAPI
&lt;/h2&gt;

&lt;p&gt;لا تسمح بوصول مواصفات غير صالحة إلى &lt;code&gt;main&lt;/code&gt;. اجعل Pull Request يفشل تلقائيًا إذا كان &lt;code&gt;openapi.yaml&lt;/code&gt; غير صالح.&lt;/p&gt;

&lt;p&gt;مثال GitHub Actions بسيط باستخدام Redocly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate OpenAPI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lint spec&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx @redocly/cli lint api/openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ابدأ بهذا الفحص، ثم أضف فحوصات أخرى تدريجيًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;linting للأسلوب والبنية.&lt;/li&gt;
&lt;li&gt;التحقق من أن الملف صالح كـ OpenAPI 3.x.&lt;/li&gt;
&lt;li&gt;مقارنة PR مع &lt;code&gt;main&lt;/code&gt; لاكتشاف breaking changes.&lt;/li&gt;
&lt;li&gt;منع الدمج إذا وُجد تغيير جوهري غير مقصود.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال عملي لاستخدام &lt;code&gt;oasdiff&lt;/code&gt; لاكتشاف التغييرات الجوهرية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OpenAPI Breaking Changes&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;breaking-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install oasdiff&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -L https://github.com/Tufin/oasdiff/releases/latest/download/oasdiff_linux_amd64.tar.gz \&lt;/span&gt;
            &lt;span class="s"&gt;| tar xz&lt;/span&gt;
          &lt;span class="s"&gt;sudo mv oasdiff /usr/local/bin/oasdiff&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Compare with main&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git fetch origin main&lt;/span&gt;
          &lt;span class="s"&gt;git show origin/main:api/openapi.yaml &amp;gt; /tmp/openapi-main.yaml&lt;/span&gt;
          &lt;span class="s"&gt;oasdiff breaking /tmp/openapi-main.yaml api/openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا يصبح اكتشاف التغييرات الخطرة جزءًا من سير العمل بدل الاعتماد على المراجعة اليدوية فقط.&lt;/p&gt;

&lt;h2&gt;
  
  
  أفضل الممارسات للتحكم في إصدار OpenAPI
&lt;/h2&gt;

&lt;p&gt;استخدم هذه القواعد للحفاظ على مواصفات مستقرة وقابلة للمراجعة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;استخدم الترقيم الدلالي للإصدارات&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
حدّث &lt;code&gt;info.version&lt;/code&gt;. التغيير الجوهري يعني إصدارًا رئيسيًا جديدًا، والإضافات المتوافقة تزيد الإصدار الثانوي.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;احتفظ بسجل تغييرات&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ضع &lt;code&gt;CHANGELOG.md&lt;/code&gt; بجانب المواصفات لتوضيح ما تغيّر بين الإصدارات.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;اجعل Pull Requests صغيرة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
تغيير منطقي واحد لكل PR. الطلبات الكبيرة تخفي breaking changes وسط الضوضاء.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;اكتب رسائل commit واضحة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
مثال جيد:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add refundReason to refund request schema"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أفضل من:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update spec"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;لا تعدّل &lt;code&gt;main&lt;/code&gt; مباشرة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
حتى إصلاح خطأ مطبعي يجب أن يمر عبر فرع وPull Request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ثبّت تنسيق YAML&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
استخدم أداة واحدة أو محررًا واحدًا لتجنب اختلافات formatting غير مفيدة.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  كيف أكتشف التغييرات الجوهرية في مواصفات OpenAPI؟
&lt;/h3&gt;

&lt;p&gt;شغّل أداة مقارنة في CI تقارن ملف PR بالنسخة الموجودة على &lt;code&gt;main&lt;/code&gt;. أدوات مثل &lt;code&gt;oasdiff&lt;/code&gt; يمكنها تصنيف التغييرات كجوهري أو غير جوهري، وتفشل البناء عند وجود تغيير غير متوافق.&lt;/p&gt;

&lt;p&gt;هذا يساعد على اكتشاف حالات مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;حذف حقل من response.&lt;/li&gt;
&lt;li&gt;إضافة parameter مطلوب.&lt;/li&gt;
&lt;li&gt;تغيير نوع حقل من &lt;code&gt;string&lt;/code&gt; إلى &lt;code&gt;integer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;إزالة قيمة من enum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  هل أستخدم ملف OpenAPI واحدًا أم أقسمه إلى عدة ملفات؟
&lt;/h3&gt;

&lt;p&gt;ابدأ بملف واحد: &lt;code&gt;api/openapi.yaml&lt;/code&gt;. هذا أسهل للمراجعة والـ versioning.&lt;/p&gt;

&lt;p&gt;قسّم فقط عندما تظهر حاجة فعلية، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;وجود إصدارات رئيسية متعددة: &lt;code&gt;api-v1.yaml&lt;/code&gt; و&lt;code&gt;api-v2.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تضخم الملف بشكل يصعّب القراءة.&lt;/li&gt;
&lt;li&gt;الحاجة إلى فصل schemas باستخدام &lt;code&gt;$ref&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تقسّم مبكرًا. ملف واحد واضح أفضل من عدة ملفات مشتتة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني التحكم في إصدار المواصفات دون كتابة YAML يدويًا؟
&lt;/h3&gt;

&lt;p&gt;نعم. يتيح وضع Apidog Spec-First تحرير المواصفات من محرر مرئي ومزامنتها مع Git في الاتجاهين. النتيجة: YAML متناسق، diffs نظيفة، Pull Requests قابلة للقراءة، مع الاحتفاظ بسجل Git الكامل والمراجعة المعتادة.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ما هو تطوير واجهات برمجة التطبيقات بمنهجية المواصفات أولاً؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:16:37 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/m-hw-ttwyr-wjht-brmj-lttbyqt-bmnhjy-lmwsft-wlan-5gnd</link>
      <guid>https://dev.to/yusuf_khalidd/m-hw-ttwyr-wjht-brmj-lttbyqt-bmnhjy-lmwsft-wlan-5gnd</guid>
      <description>&lt;p&gt;معظم أخطاء واجهات برمجة التطبيقات (API) ليست أخطاء برمجية، بل أخطاء في العقد. الواجهة الأمامية تتوقع &lt;code&gt;userId&lt;/code&gt;، والواجهة الخلفية ترسل &lt;code&gt;user_id&lt;/code&gt;، ولا يكتشف أحد ذلك حتى QA. تطوير الـ API المعتمد على المواصفات أولًا يحل هذا بتعريف العقد قبل كتابة كود الخادم.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في هذا الدليل ستكتب مواصفات OpenAPI صغيرة يدويًا، ثم تستخدم الملف نفسه لإنشاء mock server، واختبارات عقد، ووثائق API قبل تنفيذ أي endpoint. قد تسمع هذا الأسلوب بأسماء مثل: spec-first، design-first، أو contract-first. الفكرة واحدة: اتفق على الواجهة أولًا، ثم ابنِ عليها.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما هو تطوير الـ API المعتمد على المواصفات أولًا؟
&lt;/h2&gt;

&lt;p&gt;تطوير واجهات برمجة التطبيقات بالمواصفات أولًا يعني كتابة عقد قابل للقراءة آليًا، غالبًا باستخدام OpenAPI، قبل تنفيذ الـ endpoint.&lt;/p&gt;

&lt;p&gt;هذا العقد يحدد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;المسارات مثل &lt;code&gt;/users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;معاملات الاستعلام والمسار&lt;/li&gt;
&lt;li&gt;جسم الطلب &lt;code&gt;requestBody&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;شكل الاستجابة&lt;/li&gt;
&lt;li&gt;أكواد الحالة&lt;/li&gt;
&lt;li&gt;المخططات المشتركة &lt;code&gt;schemas&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بدل أن تكون الوثائق نتيجة متأخرة للكود، تصبح المواصفات هي مصدر الحقيقة. الواجهة الأمامية تبني على mock generated من المواصفات، وQA يكتب اختبارات العقد منها، والواجهة الخلفية تنفذ بناءً عليها.&lt;/p&gt;

&lt;p&gt;النتيجة العملية: مشاكل التكامل تظهر مبكرًا، قبل أن تصبح مكلفة.&lt;/p&gt;

&lt;h2&gt;
  
  
  دورة حياة spec-first مقابل code-first
&lt;/h2&gt;

&lt;p&gt;ينتج النهجان في النهاية endpoints مشابهة، لكن الاختلاف في متى تظهر المشاكل ومن يستطيع البدء مبكرًا.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2d2mxow1685k3joqza4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2d2mxow1685k3joqza4i.png" alt="مقارنة دورة حياة spec-first و code-first" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;في code-first، غالبًا تكتب المعالجات أولًا ثم توثقها لاحقًا. في spec-first، تكتب العقد أولًا، ثم يعمل كل فريق بالتوازي بناءً على التعريف نفسه.&lt;/p&gt;

&lt;h2&gt;
  
  
  مثال عملي: إنشاء OpenAPI لـ &lt;code&gt;/users&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;سنصمم endpoint بسيطة للمستخدمين. الهدف ليس بناء API كاملة، بل رؤية كيف يتحول ملف OpenAPI واحد إلى عقد قابل للاستخدام.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ابدأ برأس ملف OpenAPI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.example.com/v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الجزء يحدد إصدار OpenAPI واسم الـ API ورابط الخادم الأساسي.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. عرّف مخطط &lt;code&gt;User&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;ضع الأشكال المشتركة داخل &lt;code&gt;components/schemas&lt;/code&gt; حتى تعيد استخدامها لاحقًا باستخدام &lt;code&gt;$ref&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;createdAt&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uuid&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;date-time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا المخطط يقول إن كائن &lt;code&gt;User&lt;/code&gt; يجب أن يحتوي على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;createdAt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;كما يحدد صيغًا مهمة مثل &lt;code&gt;uuid&lt;/code&gt; و&lt;code&gt;email&lt;/code&gt; و&lt;code&gt;date-time&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. أضف &lt;code&gt;GET /users&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;List users&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;listUsers&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;limit&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
            &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
            &lt;span class="na"&gt;maximum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A list of users&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
                &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هنا عرّفنا endpoint ترجع قائمة مستخدمين، مع query parameter اسمه &lt;code&gt;limit&lt;/code&gt; وحده الأقصى &lt;code&gt;100&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. أضف &lt;code&gt;POST /users&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;createUser&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
              &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
              &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User created&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;400"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Invalid request body&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذه العملية تحدد أن إنشاء المستخدم يتطلب &lt;code&gt;email&lt;/code&gt;، ويمكن أن يحتوي اختياريًا على &lt;code&gt;name&lt;/code&gt;. عند النجاح ترجع &lt;code&gt;201&lt;/code&gt; وكائن &lt;code&gt;User&lt;/code&gt;. عند الخطأ ترجع &lt;code&gt;400&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. الملف الكامل
&lt;/h3&gt;

&lt;p&gt;استخدم هذا الملف كنقطة بداية قابلة للتشغيل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;

&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.example.com/v1&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;List users&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;listUsers&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;limit&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
            &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
            &lt;span class="na"&gt;maximum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A list of users&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
                &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User"&lt;/span&gt;

    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;createUser&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
              &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
              &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
                  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User created&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;400"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Invalid request body&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;createdAt&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uuid&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;date-time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا أصبح لديك عقد يحدد الحقول، الأنواع، القيود، وأكواد الحالة قبل كتابة أي كود backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا تفعل بهذا الملف؟
&lt;/h2&gt;

&lt;p&gt;السبب العملي لكتابة المواصفات أولًا هو أن ملفًا واحدًا يمكنه تشغيل ثلاث عمليات مهمة: النماذج، الاختبارات، والوثائق.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. إنشاء Mock Server
&lt;/h3&gt;

&lt;p&gt;خادم الـ mock يقرأ مواصفات OpenAPI ويعيد استجابات مطابقة للمخططات.&lt;/p&gt;

&lt;p&gt;مثال: الواجهة الأمامية يمكنها استدعاء:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users?limit=20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وتحصل على استجابة مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4c84f9a2-8c9c-4e6e-b1c3-123456789abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-02T10:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يسمح لفريق frontend بالبدء قبل توفر التنفيذ الحقيقي.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. كتابة اختبارات عقد Contract Tests
&lt;/h3&gt;

&lt;p&gt;بما أن المواصفات تحدد أنواع الحقول والاستجابات، يمكنك استخدامها للتحقق من أن التنفيذ الحقيقي لا يخرج عن العقد.&lt;/p&gt;

&lt;p&gt;أمثلة على ما يجب اختباره:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /users&lt;/code&gt; يرجع &lt;code&gt;201&lt;/code&gt; عند إرسال &lt;code&gt;email&lt;/code&gt; صالح.&lt;/li&gt;
&lt;li&gt;الاستجابة تطابق مخطط &lt;code&gt;User&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;الطلب بدون &lt;code&gt;email&lt;/code&gt; يرجع &lt;code&gt;400&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /users&lt;/code&gt; يرجع array من كائنات &lt;code&gt;User&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;limit&lt;/code&gt; لا يتجاوز &lt;code&gt;100&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الفكرة ليست اختراع assertions جديدة، بل التحقق من أن الكود يطابق ما اتفق عليه الفريق.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. توليد الوثائق
&lt;/h3&gt;

&lt;p&gt;وثائق الـ API يمكن عرضها مباشرة من ملف OpenAPI. كل endpoint وparameter وschema يظهر من المصدر نفسه، لذلك لا تحتاج إلى نسخة وثائق منفصلة يمكن أن تصبح قديمة.&lt;/p&gt;

&lt;p&gt;هذا يتكامل جيدًا مع &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل واجهة برمجة التطبيقات الأصلي لـ Git&lt;/a&gt;: المواصفات ملف نصي، وكل تغيير يظهر كـ diff يمكن مراجعته في pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  تنفيذ ذلك في Apidog
&lt;/h2&gt;

&lt;p&gt;يدعم Apidog هذا الأسلوب من خلال &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وضع المواصفات أولًا Spec-First Mode&lt;/a&gt;. بدل التعامل مع OpenAPI كتصدير نهائي، يتعامل معه كمصدر المشروع.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmv53bvz1fcju773vp8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmv53bvz1fcju773vp8q.png" alt="وضع المواصفات أولًا في Apidog" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;سير العمل العملي يكون كالتالي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اكتب أو الصق مواصفات &lt;code&gt;/users&lt;/code&gt; في محرر OpenAPI.&lt;/li&gt;
&lt;li&gt;يحلل Apidog الملف وينشئ endpoints بناءً عليه.&lt;/li&gt;
&lt;li&gt;يتم إنشاء mock server للعمليات الموجودة في المواصفات.&lt;/li&gt;
&lt;li&gt;تبدأ الواجهة الأمامية باستخدام الـ mock.&lt;/li&gt;
&lt;li&gt;يتم توليد الوثائق من المواصفات نفسها.&lt;/li&gt;
&lt;li&gt;عند جاهزية backend، شغّل العمليات كحالات اختبار.&lt;/li&gt;
&lt;li&gt;تحقق من أن الاستجابات الحقيقية تطابق schemas المعلنة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الميزة المهمة هنا هي مزامنة Git ثنائية الاتجاه. تعيش المواصفات في المستودع، وتتم مراجعة التغييرات كـ commits. إذا عدّلت YAML في محررك ودفعت التغيير، يستطيع Apidog مزامنته. وإذا عدّلت داخل Apidog، يمكن أن تهبط التغييرات كتثبيت يمكن للفريق مراجعته.&lt;/p&gt;

&lt;p&gt;للمقارنة الأعمق بين هذا النهج ونهج التصميم أولًا، راجع: &lt;a href="https://apidog.com/ar/blog/spec-first-vs-design-first-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;المواصفات أولًا مقابل التصميم أولًا في Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  قائمة مراجعة قبل اعتماد المواصفات
&lt;/h2&gt;

&lt;p&gt;قبل أن يبدأ الفريق بالبناء على ملف OpenAPI، تحقق من التالي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ملف OpenAPI صالح ولا يحتوي على أخطاء schema.&lt;/li&gt;
&lt;li&gt;كل endpoint يحتوي على response نجاح واحد على الأقل.&lt;/li&gt;
&lt;li&gt;كل endpoint يحتوي على response خطأ واحد على الأقل.&lt;/li&gt;
&lt;li&gt;الأشكال المشتركة موجودة في &lt;code&gt;components/schemas&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;يتم استخدام &lt;code&gt;$ref&lt;/code&gt; بدل نسخ schemas في أكثر من مكان.&lt;/li&gt;
&lt;li&gt;الحقول المطلوبة محددة بـ &lt;code&gt;required&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;الصيغ مثل &lt;code&gt;uuid&lt;/code&gt; و&lt;code&gt;email&lt;/code&gt; و&lt;code&gt;date-time&lt;/code&gt; مضبوطة عند الحاجة.&lt;/li&gt;
&lt;li&gt;معاملات الاستعلام لها أنواع وحدود واضحة.&lt;/li&gt;
&lt;li&gt;ملف المواصفات محفوظ في Git.&lt;/li&gt;
&lt;li&gt;التغييرات على العقد تتم مراجعتها عبر pull requests.&lt;/li&gt;
&lt;li&gt;mock server يعمل من نفس المواصفات.&lt;/li&gt;
&lt;li&gt;اختبارات العقد تتحقق من الاستجابات الحقيقية.&lt;/li&gt;
&lt;li&gt;الوثائق المنشورة مولدة من الملف نفسه.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا تحققت هذه النقاط، يمكن للفرق العمل بالتوازي بناءً على عقد واحد بدل الاعتماد على افتراضات مختلفة.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل spec-first هو نفسه design-first؟
&lt;/h3&gt;

&lt;p&gt;غالبًا نعم. مصطلحات spec-first وdesign-first وcontract-first تشير إلى المبدأ نفسه: تعريف الواجهة قبل التنفيذ. الاختلاف أن spec-first يركز على ملف المواصفات نفسه، مثل OpenAPI، كمخرج عملي قابل للاستخدام.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يجب كتابة YAML يدويًا؟
&lt;/h3&gt;

&lt;p&gt;لا. يمكنك استخدام محرر مرئي لإنتاج OpenAPI، أو كتابة YAML مباشرة. المهم أن يكون العقد موجودًا ومتفقًا عليه قبل تنفيذ الكود.&lt;/p&gt;

&lt;p&gt;في فرق كثيرة، يبدأ التصميم بصريًا ثم تتم مراجعة YAML في Git قبل التنفيذ.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أمنع تباعد المواصفات عن الكود؟
&lt;/h3&gt;

&lt;p&gt;اجعل المواصفات مصدر الحقيقة، ثم افرضها آليًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;خزّن ملف OpenAPI في Git.&lt;/li&gt;
&lt;li&gt;راجع أي تغيير في العقد عبر pull request.&lt;/li&gt;
&lt;li&gt;شغّل contract tests في CI.&lt;/li&gt;
&lt;li&gt;افشل build إذا لم تطابق الاستجابة المخطط.&lt;/li&gt;
&lt;li&gt;استخدم مزامنة ثنائية الاتجاه إذا كان الفريق يحرر المواصفات من أكثر من مكان.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;تطوير الـ API بالمواصفات أولًا هو تغيير بسيط في الترتيب: اكتب العقد، راجعه، ثم نفّذ الكود. لكنه يقلل أخطاء التكامل، ويسمح للواجهة الأمامية وQA والواجهة الخلفية بالعمل بالتوازي.&lt;/p&gt;

&lt;p&gt;إذا أردت تجربة الدورة كاملة، افتح &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وضع المواصفات أولًا Spec-First Mode&lt;/a&gt; في Apidog واربطه بمستودعك.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ماذا يعني التعامل مع مواصفات API الخاصة بك ككود؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 07:05:44 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/mdh-yny-ltml-m-mwsft-api-lkhs-bk-kkwd-182e</link>
      <guid>https://dev.to/yusuf_khalidd/mdh-yny-ltml-m-mwsft-api-lkhs-bk-kkwd-182e</guid>
      <description>&lt;p&gt;ربما يعيش عقد واجهة برمجة التطبيقات (API) لديك في ثلاثة أماكن في الوقت نفسه: رسم في الويكي، مجموعة Postman قديمة، ومستند Markdown يدوي لم يعد يطابق الخدمة الفعلية. عندما تختلف هذه المصادر، يبدأ الفريق بالتخمين. والتخمين يكسر التكاملات.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;الحل العملي هو التعامل مع مواصفات API كتعليمات برمجية. اكتب ملف OpenAPI واحدًا، ضعه في Git، راجعه عبر Pull Requests، ثم أنشئ منه النماذج الوهمية، الاختبارات، الوثائق، وSDKs. بهذه الطريقة تصبح المواصفات عقدًا قابلًا للمراجعة والتنفيذ، وليس مستندًا منفصلًا عن الكود.&lt;/p&gt;

&lt;p&gt;في هذا الدليل ستتعلم كيف تطبق سير عمل &lt;strong&gt;المواصفات كتعليمات برمجية&lt;/strong&gt; باستخدام OpenAPI وGit، وما الفحوصات التي يجب إضافتها لتقليل الانحراف بين المواصفات والخدمة الحية.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا تعني "المواصفات كتعليمات برمجية"
&lt;/h2&gt;

&lt;p&gt;تعني أن تعريف API لديك ملف نصي عادي، عادةً &lt;code&gt;openapi.yaml&lt;/code&gt; أو &lt;code&gt;openapi.json&lt;/code&gt;، محفوظ داخل مستودع Git. يمكنك مراجعته، تفريعه، دمجه، تتبع تاريخه، والتراجع عنه مثل أي ملف مصدر آخر.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gz2n0s4ljtawy2bhjuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gz2n0s4ljtawy2bhjuw.png" alt="OpenAPI كملف داخل Git" width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;بدل أن تكون المواصفات صفحة مستضافة أو تصديرًا من أداة، تصبح قطعة أثرية قابلة للتشغيل داخل سير العمل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/openapi.yaml
        ↓
mocks
        ↓
contract tests
        ↓
API docs
        ↓
SDKs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;النتيجة العملية: ملف واحد هو مصدر الحقيقة. إذا أراد مطور معرفة ما تعيده &lt;code&gt;/users/{id}&lt;/code&gt;، يقرأ المواصفات. إذا أراد فريق QA كتابة اختبار، يبنيه على المواصفات. إذا احتاج فريق الواجهة الأمامية نموذجًا وهميًا، يتم توليده من نفس الملف.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا يجب وضع المواصفات في Git
&lt;/h2&gt;

&lt;p&gt;عندما تصبح المواصفات ملفًا في Git، تحصل مباشرةً على نفس آليات الحوكمة التي تستخدمها مع الكود.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. مراجعة تغييرات API عبر Pull Requests
&lt;/h3&gt;

&lt;p&gt;أي تعديل في endpoint يظهر كـ diff واضح:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;حقل جديد في response&lt;/li&gt;
&lt;li&gt;حذف حقل موجود&lt;/li&gt;
&lt;li&gt;تغيير enum&lt;/li&gt;
&lt;li&gt;إضافة status code&lt;/li&gt;
&lt;li&gt;تعديل schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بدل اكتشاف الكسر في الإنتاج، يظهر في مراجعة PR. هذا هو أساس &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل واجهة برمجة التطبيقات الأصلي لـ Git&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. فروقات واضحة وقابلة للقراءة
&lt;/h3&gt;

&lt;p&gt;ملفات YAML تجعل التغييرات سهلة القراءة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; status:
   type: string
&lt;span class="gd"&gt;-  enum: [pending, shipped, delivered]
&lt;/span&gt;&lt;span class="gi"&gt;+  enum: [pending, paid, shipped, delivered]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا أفضل من تصدير غير واضح أو تغييرات داخل أداة لا تعرض تاريخًا مفصلًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. إصدار وتراجع حقيقيان
&lt;/h3&gt;

&lt;p&gt;يمكنك استخدام Git لإدارة دورة حياة API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git tag api-v1.2.0
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; api-v2-redesign
git revert &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;كل تغيير له مؤلف، وقت، ورسالة commit. وللتعمق أكثر في التفرع ووضع العلامات، راجع &lt;a href="https://apidog.com/ar/blog/openapi-version-control-with-git?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;التحكم في إصدار OpenAPI باستخدام Git&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. مصدر واحد للحقيقة
&lt;/h3&gt;

&lt;p&gt;إذا كانت النماذج الوهمية، الاختبارات، الوثائق، وSDKs كلها تُنشأ من نفس ملف OpenAPI، فلن تنحرف بشكل مستقل. حدّث المواصفات، ثم أعد توليد المخرجات.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الاهتمام&lt;/th&gt;
&lt;th&gt;المواصفات في أداة مستضافة&lt;/th&gt;
&lt;th&gt;مواصفات API كتعليمات برمجية&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;مراجعة التغيير&lt;/td&gt;
&lt;td&gt;يدوية وسهلة التفويت&lt;/td&gt;
&lt;td&gt;Diff داخل Pull Request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التاريخ&lt;/td&gt;
&lt;td&gt;محدود أو مرتبط بالبائع&lt;/td&gt;
&lt;td&gt;سجل Git كامل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التراجع&lt;/td&gt;
&lt;td&gt;غالبًا يدوي&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git revert&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مصدر الحقيقة&lt;/td&gt;
&lt;td&gt;غير واضح&lt;/td&gt;
&lt;td&gt;الملف الملتزم به&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تكامل CI&lt;/td&gt;
&lt;td&gt;إضافة لاحقة&lt;/td&gt;
&lt;td&gt;جزء طبيعي من سير العمل&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  OpenAPI كقطعة أثرية قابلة للتنفيذ
&lt;/h2&gt;

&lt;p&gt;OpenAPI هو التنسيق العملي الأكثر شيوعًا لأنه قابل للقراءة من البشر والآلات. احتفظ بالملف داخل المستودع، مثلًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال مختصر لملف OpenAPI 3.1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1.0&lt;/span&gt;

&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Orders API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.2.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{orderId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get an order by ID&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;getOrder&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orderId&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
            &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uuid&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;The requested order&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Order"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Order&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;total&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uuid&lt;/span&gt;
        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pending&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;shipped&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;delivered&lt;/span&gt;
        &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;number&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;float&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الملف هو العقد. إذا أضفت حقلًا إلى &lt;code&gt;Order&lt;/code&gt;، يظهر التغيير في PR. إذا غيّرت قيم &lt;code&gt;status&lt;/code&gt;، يراها المراجع فورًا. وإذا كسرت التوافق العكسي، يمكن للفريق إيقاف الدمج قبل أن يصل التغيير إلى العملاء.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما الذي يمكنك توليده من المواصفات
&lt;/h2&gt;

&lt;p&gt;القيمة لا تأتي من وجود ملف OpenAPI فقط، بل من ربطه بالمخرجات اليومية للفريق.&lt;/p&gt;

&lt;h3&gt;
  
  
  النماذج الوهمية Mocks
&lt;/h3&gt;

&lt;p&gt;استخدم المواصفات لتشغيل API وهمية قبل تنفيذ endpoint فعليًا. هذا يسمح لفريق الواجهة الأمامية أو تطبيقات الجوال بالبدء مبكرًا بناءً على العقد.&lt;/p&gt;

&lt;p&gt;مثال سير عمل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. أضف endpoint جديدًا إلى openapi.yaml
2. شغّل mock server من المواصفات
3. يستهلك فريق الواجهة الأمامية endpoint الوهمي
4. ينفذ فريق backend endpoint الحقيقي وفق العقد
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  اختبارات العقد Contract Tests
&lt;/h3&gt;

&lt;p&gt;أضف اختبارات تتحقق من أن الخدمة الحية تطابق المواصفات. إذا أعادت API حقلًا غير موثق أو أسقطت حقلًا مطلوبًا، يجب أن يفشل الاختبار.&lt;/p&gt;

&lt;p&gt;مثال الفكرة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openapi.yaml + running API → contract test → pass/fail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الوثائق
&lt;/h3&gt;

&lt;p&gt;بدل كتابة جداول endpoint يدويًا، اعرض المواصفات كوثائق مرجعية. الوثائق هنا ليست نسخة ثانية؛ هي عرض للمواصفات نفسها.&lt;/p&gt;

&lt;h3&gt;
  
  
  SDKs
&lt;/h3&gt;

&lt;p&gt;يمكن توليد مكتبات عميل من نفس الملف. هذا مفيد عندما يكون لديك شركاء أو فرق داخلية تستهلك API بلغات مختلفة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u9rm3s7pnmk1w81kg73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u9rm3s7pnmk1w81kg73.png" alt="مخرجات متعددة من مواصفات واحدة" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف يجعل Apidog المواصفات مصدر الحقيقة الوحيد
&lt;/h2&gt;

&lt;p&gt;تشغيل هذا يدويًا يعني غالبًا ربط عدة أدوات: CLI للفحص، mock server، مولد وثائق، ومزامنة Git. Apidog يجمع هذه الأجزاء في سير عمل واحد.&lt;/p&gt;

&lt;p&gt;في وضع &lt;strong&gt;Spec-First Mode&lt;/strong&gt;، يتعامل Apidog مع ملف OpenAPI كتعريف موثوق. يمكنك تصميم endpoints بصريًا أو تحرير YAML، ثم إبقاء النماذج الوهمية، الاختبارات، والوثائق متوافقة مع نفس المواصفات.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7bcx8ew9q72hezc4yi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7bcx8ew9q72hezc4yi0.png" alt="Spec-First Mode في Apidog" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الميزة العملية هنا هي مزامنة Git ثنائية الاتجاه. يمكن لـ Apidog قراءة ملف OpenAPI من المستودع وكتابة التغييرات إليه، بحيث يبقى ملف Git ومشروع Apidog متزامنين. صمّم بصريًا عندما يكون ذلك أسرع، وعدّل YAML مباشرة عندما تحتاج دقة أكبر. كلا المسارين يؤديان إلى نفس الملف الملتزم به.&lt;/p&gt;

&lt;p&gt;لمعرفة خطوات مزامنة التغييرات مع GitHub، راجع &lt;a href="https://apidog.com/ar/blog/sync-openapi-spec-to-github?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية مزامنة مواصفات OpenAPI الخاصة بك مع GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  سير عمل عملي لتطبيق المواصفات كتعليمات برمجية
&lt;/h2&gt;

&lt;p&gt;ابدأ بسير عمل صغير يمكن تنفيذه خلال يوم واحد.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ضع ملف OpenAPI في المستودع
&lt;/h3&gt;

&lt;p&gt;اختر مسارًا ثابتًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم أضفه إلى Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add api/openapi.yaml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add OpenAPI specification"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. اجعل تغييرات المواصفات تمر عبر PR
&lt;/h3&gt;

&lt;p&gt;لا تعدّل المواصفات خارج سير المراجعة. أي تغيير في API يجب أن يكون داخل Pull Request، بجانب الكود أو قبله.&lt;/p&gt;

&lt;p&gt;مثال رسالة commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add order cancellation endpoint"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. أضف فحص صحة المواصفات في CI
&lt;/h3&gt;

&lt;p&gt;شغّل فحصًا يرفض ملفات OpenAPI غير الصالحة قبل الدمج. الفكرة الأساسية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Spec Check&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint-openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate OpenAPI spec&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Run your OpenAPI lint or validation command here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم الأداة التي تناسب فريقك، لكن اجعل الفحص إلزاميًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. ولّد مخرجًا واحدًا أولًا
&lt;/h3&gt;

&lt;p&gt;لا تبدأ بكل شيء مرة واحدة. اختر مخرجًا واحدًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;وثائق API&lt;/li&gt;
&lt;li&gt;mock server&lt;/li&gt;
&lt;li&gt;contract tests&lt;/li&gt;
&lt;li&gt;SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ابدأ بما يسبب أكبر ألم حاليًا. إذا كان فريق الواجهة الأمامية ينتظر backend كثيرًا، ابدأ بالنماذج الوهمية. إذا كانت الوثائق تنحرف، ابدأ بتوليد الوثائق.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. أضف اختبارات عقد لاحقًا
&lt;/h3&gt;

&lt;p&gt;بعد استقرار المواصفات، اربطها بالخدمة الحية. الهدف أن يفشل CI إذا لم تعد API المنشورة تطابق &lt;code&gt;openapi.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  المزالق الشائعة وكيف تتجنبها
&lt;/h2&gt;

&lt;h3&gt;
  
  
  الانحراف بين المواصفات والتنفيذ
&lt;/h3&gt;

&lt;p&gt;كتابة المواصفات لا تكفي. إذا لم تتحقق من الخدمة الحية مقابلها، ستنحرف بمرور الوقت.&lt;/p&gt;

&lt;p&gt;الحل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAPI spec → contract tests → CI gate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  خلط المصدر الموثوق
&lt;/h3&gt;

&lt;p&gt;بعض الفرق تولّد OpenAPI من تعليقات الكود، ثم تعدّل الملف يدويًا أيضًا. هذا يخلق مصدرين للحقيقة.&lt;/p&gt;

&lt;p&gt;اختر اتجاهًا واحدًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إما الكود يولّد المواصفات&lt;/li&gt;
&lt;li&gt;أو المواصفات تقود الكود&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كنت تطبق spec-first، فاجعل &lt;code&gt;openapi.yaml&lt;/code&gt; هو المصدر الموثوق.&lt;/p&gt;

&lt;h3&gt;
  
  
  التعامل مع المواصفات كوثائق فقط
&lt;/h3&gt;

&lt;p&gt;إذا كانت المواصفات تُقرأ فقط، فهي وثيقة. إذا كانت تولّد mocks واختبارات ووثائق وSDKs، فهي عقد قابل للتنفيذ.&lt;/p&gt;

&lt;h3&gt;
  
  
  تخطي المراجعة
&lt;/h3&gt;

&lt;p&gt;وجود الملف في Git لا يكفي. يجب أن تمر تغييرات API عبر Pull Requests ومراجعة فعلية، خصوصًا عند تغيير response schemas أو حذف حقول.&lt;/p&gt;

&lt;h2&gt;
  
  
  البدء
&lt;/h2&gt;

&lt;p&gt;اتبع هذه الخطة المختصرة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;انقل مواصفات OpenAPI إلى المستودع، مثل &lt;code&gt;api/openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;اجعل كل تغييرات المواصفات تمر عبر Pull Request.&lt;/li&gt;
&lt;li&gt;أضف فحص صحة OpenAPI في CI.&lt;/li&gt;
&lt;li&gt;ولّد مخرجًا واحدًا من المواصفات: mock أو docs أو tests.&lt;/li&gt;
&lt;li&gt;أضف اختبارات عقد تمنع الانحراف بين المواصفات والخدمة الحية.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;التحول بسيط: ملف واحد في Git، يُراجع مثل الكود، وتُبنى عليه المخرجات. إذا كنت تريد تحريرًا بصريًا مع مزامنة Git، &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;جرّب وضع Spec-First Mode في Apidog&lt;/a&gt; واجعل ملف OpenAPI مصدر الحقيقة الوحيد.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل "مواصفات API كتعليمات برمجية" هي نفسها "وثائق كتعليمات برمجية"؟
&lt;/h3&gt;

&lt;p&gt;ليستا الشيء نفسه، لكنهما تستخدمان الفلسفة نفسها. الوثائق كتعليمات برمجية تطبق Git والمراجعة على الوثائق. المواصفات كتعليمات برمجية تطبق ذلك على عقد API نفسه. عند توليد الوثائق من مواصفات محفوظة في Git، تحصل على الاثنين معًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما التنسيق الأفضل لملف المواصفات؟
&lt;/h3&gt;

&lt;p&gt;OpenAPI بصيغة YAML هو الخيار العملي الشائع. YAML سهل القراءة ويظهر فروقات واضحة في Pull Requests، مع بقائه قابلًا للمعالجة آليًا. JSON يعمل أيضًا، لكن YAML عادةً أوضح في المراجعة.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أمنع المواصفات من الانحراف عن API الحقيقية؟
&lt;/h3&gt;

&lt;p&gt;أضف اختبارات عقد إلى CI تتحقق من أن الخدمة قيد التشغيل تطابق ملف OpenAPI الملتزم به. إذا أعادت endpoint حقلًا غير معلن أو أسقطت حقلًا مطلوبًا، يجب أن يفشل البناء قبل الدمج أو النشر.&lt;/p&gt;

</description>
      <category>api</category>
      <category>devops</category>
      <category>git</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>أيهما أفضل: نمط تصميم API أولاً أم نمط التحديد أولاً في Apidog؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 06:27:50 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/yhm-fdl-nmt-tsmym-api-wlan-m-nmt-lthdyd-wlan-fy-apidog-1jgm</link>
      <guid>https://dev.to/yusuf_khalidd/yhm-fdl-nmt-tsmym-api-wlan-m-nmt-lthdyd-wlan-fy-apidog-1jgm</guid>
      <description>&lt;p&gt;تمنحك وحدة APIs في Apidog طريقتين لبناء عقد API نفسه: &lt;strong&gt;وضع التصميم أولاً&lt;/strong&gt; عبر واجهة مرئية، و&lt;strong&gt;وضع المواصفات أولاً&lt;/strong&gt; عبر محرر YAML/JSON متصل بـ Git. كلاهما ينتج مواصفات OpenAPI صالحة؛ الاختلاف الحقيقي هو طريقة عمل فريقك يوميًا: هل يفضّل النماذج المنظمة أم تحرير ملف المواصفات مباشرة؟&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في هذا الدليل ستتعلم متى تستخدم كل وضع، كيف يتعامل كل منهما مع Git، وكيف تختار الوضع الافتراضي المناسب لفريقك. يمكنك التبديل بين الوضعين من مفتاح واحد في أسفل يسار وحدة APIs، لذلك لا تحتاج إلى قرار نهائي من البداية.&lt;/p&gt;

&lt;h2&gt;
  
  
  الفلسفتان
&lt;/h2&gt;

&lt;p&gt;قبل اختيار الوضع، حدّد طريقة التفكير:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;العقد أولاً&lt;/strong&gt;: تحدد API contract قبل كتابة التنفيذ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;العقد هو مصدر الحقيقة&lt;/strong&gt;: الوثائق، الاختبارات، المحاكاة، والكود الناتج تعتمد عليه.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI هو الناتج المشترك&lt;/strong&gt;: سواء استخدمت واجهة مرئية أو YAML/JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  التصميم أولاً
&lt;/h3&gt;

&lt;p&gt;في التصميم أولاً، تبني العقد عبر واجهة منظمة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;اختر HTTP method مثل &lt;code&gt;GET&lt;/code&gt; أو &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أضف المسار مثل &lt;code&gt;/users/{id}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;عرّف path/query/header parameters.&lt;/li&gt;
&lt;li&gt;أنشئ request/response schemas.&lt;/li&gt;
&lt;li&gt;أضف أمثلة للاختبار والتوثيق.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الأداة تمنع الكثير من الأخطاء لأنك تدخل القيم من نماذج وقوائم بدل كتابة YAML يدويًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  المواصفات أولاً
&lt;/h3&gt;

&lt;p&gt;في المواصفات أولاً، تكتب العقد مباشرة كملف OpenAPI أو Swagger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get user by ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هنا يكون ملف المواصفات هو سطح العمل الأساسي، وتتعامل معه مثل أي ملف مصدر داخل Git.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ملاحظة مهمة: كلا وضعي Apidog يحافظان على العقد قبل الكود. الاختلاف ليس في الفلسفة، بل في طريقة تأليف العقد: نماذج مرئية أم محرر نصوص.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;للسياق الأوسع حول التعامل مع المواصفات كقطعة أثرية ذات إصدار، راجع: &lt;a href="https://apidog.com/ar/blog/git-native-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل API الأصلي لـ Git&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  وضع التصميم أولاً في Apidog
&lt;/h2&gt;

&lt;p&gt;وضع التصميم أولاً هو المصمم المرئي داخل Apidog. بدلاً من كتابة OpenAPI يدويًا، تبني العقد خطوة بخطوة من الواجهة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0wrosedfuvamr3j2gq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0wrosedfuvamr3j2gq6.png" alt="وضع التصميم أولاً في Apidog" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;استخدم هذا الوضع عندما تريد بناء API بسرعة دون القلق بشأن صياغة OpenAPI.&lt;/p&gt;

&lt;p&gt;خطوات عملية:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح مشروعك في Apidog.&lt;/li&gt;
&lt;li&gt;انتقل إلى وحدة &lt;strong&gt;APIs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;أنشئ endpoint جديدًا.&lt;/li&gt;
&lt;li&gt;اختر method والمسار.&lt;/li&gt;
&lt;li&gt;أضف parameters.&lt;/li&gt;
&lt;li&gt;عرّف body schema عبر محرر الشجرة.&lt;/li&gt;
&lt;li&gt;أضف response schema مثل &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;500&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أرفق أمثلة قابلة للاستخدام في الاختبار والوثائق.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال عملي لنقطة نهاية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/{id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;المعاملات:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الاسم&lt;/th&gt;
&lt;th&gt;المكان&lt;/th&gt;
&lt;th&gt;النوع&lt;/th&gt;
&lt;th&gt;مطلوب&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;path&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;نعم&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;استجابة ناجحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ali"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ali@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;متى يكون هذا الوضع مناسبًا؟&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;عندما لا يكون كل أعضاء الفريق خبراء في OpenAPI.&lt;/li&gt;
&lt;li&gt;عندما يشارك مدراء المنتجات أو QA في مراجعة العقد.&lt;/li&gt;
&lt;li&gt;عندما تبدأ API جديدًا من الصفر.&lt;/li&gt;
&lt;li&gt;عندما تريد تقليل أخطاء الصياغة في YAML/JSON.&lt;/li&gt;
&lt;li&gt;عندما تحتاج إلى مراجعة منظمة بدل diff نصي طويل.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يدعم وضع التصميم أولاً الفروع داخل Apidog، لذلك يمكن للفريق العمل على إصدارات مختلفة من تصميم API ثم مراجعتها ومطابقتها لاحقًا.&lt;/p&gt;

&lt;p&gt;المقايضة الأساسية: إذا كنت تفكر مباشرة بصيغة OpenAPI، قد تبدو النماذج كطبقة إضافية بينك وبين ملف المواصفات.&lt;/p&gt;

&lt;h2&gt;
  
  
  وضع المواصفات أولاً في Apidog
&lt;/h2&gt;

&lt;p&gt;وضع المواصفات أولاً، المتوفر حاليًا في النسخة التجريبية، مناسب للفرق التي تريد أن يعيش تعريف API داخل Git مثل أي ملف مصدر آخر.&lt;/p&gt;

&lt;p&gt;بدلاً من النماذج، تحصل على محرر YAML/JSON على غرار IDE وتكتب OpenAPI أو Swagger مباشرة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjoucthb739ypp0u9pf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjoucthb739ypp0u9pf4.png" alt="وضع المواصفات أولاً في Apidog" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;يدعم المحرر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تمييز بناء الجملة.&lt;/li&gt;
&lt;li&gt;التحقق المضمن.&lt;/li&gt;
&lt;li&gt;الإكمال التلقائي لمخططات OpenAPI وSwagger.&lt;/li&gt;
&lt;li&gt;مخططًا تفصيليًا للمسارات والمكونات في الشريط الجانبي.&lt;/li&gt;
&lt;li&gt;مؤشر مزامنة يوضح حالة التوافق مع المستودع المتصل.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال أكثر اكتمالًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.3&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Users API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;/users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create user&lt;/span&gt;
      &lt;span class="na"&gt;requestBody&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/CreateUserRequest"&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;201"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User created&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User"&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;CreateUserRequest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;

    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  كيف يعمل Git في وضع المواصفات أولاً
&lt;/h2&gt;

&lt;p&gt;الميزة الأساسية هنا هي المزامنة ثنائية الاتجاه مع Git.&lt;/p&gt;

&lt;p&gt;يمكنك توصيل مستودع على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;GitLab&lt;/li&gt;
&lt;li&gt;Azure DevOps عبر اتصال Git عام&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بعد الربط، يمكنك العمل بطريقتين:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. التحرير من Apidog ثم الدفع إلى Git
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;افتح ملف المواصفات في Apidog.&lt;/li&gt;
&lt;li&gt;عدّل YAML أو JSON.&lt;/li&gt;
&lt;li&gt;تحقق من الأخطاء داخل المحرر.&lt;/li&gt;
&lt;li&gt;نفّذ commit من التطبيق.&lt;/li&gt;
&lt;li&gt;ادفع التغييرات إلى المستودع.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. التحرير من محرر الكود ثم السحب إلى Apidog
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;افتح ملف المواصفات في VS Code أو أي محرر.&lt;/li&gt;
&lt;li&gt;عدّل الملف.&lt;/li&gt;
&lt;li&gt;نفّذ commit وpush.&lt;/li&gt;
&lt;li&gt;اسحب التغييرات إلى Apidog.&lt;/li&gt;
&lt;li&gt;راجع العقد والوثائق والاختبارات داخل Apidog.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;بهذا يصبح Apidog نافذة على ملف المواصفات نفسه، وليس نسخة منفصلة من الحقيقة.&lt;/p&gt;

&lt;p&gt;يمكنك قراءة خطوات الإعداد الكاملة في &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وثائق وضع المواصفات أولاً&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;إذا كان فريقك يتعامل مع المواصفات كتعليمات برمجية، راجع أيضًا: &lt;a href="https://apidog.com/ar/blog/api-spec-as-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مواصفات الـ API كتعليمات برمجية&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  مقارنة سريعة بين الوضعين
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الجانب&lt;/th&gt;
&lt;th&gt;وضع التصميم أولاً&lt;/th&gt;
&lt;th&gt;وضع المواصفات أولاً&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;المحرر&lt;/td&gt;
&lt;td&gt;نماذج مرئية وشجرة مخطط&lt;/td&gt;
&lt;td&gt;محرر YAML/JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;طريقة التأليف&lt;/td&gt;
&lt;td&gt;بناء العقد من الواجهة&lt;/td&gt;
&lt;td&gt;كتابة OpenAPI/Swagger يدويًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;فروع داخل Apidog&lt;/td&gt;
&lt;td&gt;مزامنة ثنائية الاتجاه مع Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التحقق&lt;/td&gt;
&lt;td&gt;عبر قيود النماذج&lt;/td&gt;
&lt;td&gt;تحقق مدمج وإكمال تلقائي&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التنقل&lt;/td&gt;
&lt;td&gt;قائمة endpoints ومجلدات&lt;/td&gt;
&lt;td&gt;مخطط تفصيلي من ملف المواصفات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;منحنى التعلم&lt;/td&gt;
&lt;td&gt;منخفض&lt;/td&gt;
&lt;td&gt;أعلى&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;الأفضل لـ&lt;/td&gt;
&lt;td&gt;فرق متعددة المهارات&lt;/td&gt;
&lt;td&gt;فرق هندسية تعتمد Git وPRs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  أي وضع تختار؟
&lt;/h2&gt;

&lt;p&gt;استخدم &lt;strong&gt;وضع التصميم أولاً&lt;/strong&gt; إذا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فريقك لا يتقن OpenAPI بالكامل.&lt;/li&gt;
&lt;li&gt;تحتاج إلى إشراك PM أو QA في تصميم API.&lt;/li&gt;
&lt;li&gt;تريد بناء endpoint جديد بسرعة.&lt;/li&gt;
&lt;li&gt;تفضل مراجعة منظمة بدل YAML diff.&lt;/li&gt;
&lt;li&gt;تريد تقليل أخطاء الصياغة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استخدم &lt;strong&gt;وضع المواصفات أولاً&lt;/strong&gt; إذا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ملف OpenAPI موجود بالفعل في Git.&lt;/li&gt;
&lt;li&gt;تراجع تغييرات API عبر pull requests.&lt;/li&gt;
&lt;li&gt;تشغل فحوصات المواصفات في CI.&lt;/li&gt;
&lt;li&gt;تريد ملف YAML/JSON واحدًا تستخدمه عدة أدوات.&lt;/li&gt;
&lt;li&gt;يفضل فريقك العمل داخل محررات الكود.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مسار عملي لكثير من الفرق:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ابدأ بـ &lt;strong&gt;التصميم أولاً&lt;/strong&gt; عند بناء API جديد.&lt;/li&gt;
&lt;li&gt;استخدم الواجهة المرئية لتثبيت المسارات والمخططات.&lt;/li&gt;
&lt;li&gt;عندما ينضج العقد، انتقل إلى &lt;strong&gt;المواصفات أولاً&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;اربط المواصفات بـ Git لمراجعتها وإصدارها مع الكود.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الوضعان ليسا منتجين متنافسين. إنهما طريقتان لتحرير العقد نفسه.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيفية التبديل بين الأوضاع
&lt;/h2&gt;

&lt;p&gt;للتبديل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح مشروعك في Apidog.&lt;/li&gt;
&lt;li&gt;انتقل إلى وحدة &lt;strong&gt;APIs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;انظر إلى الزاوية السفلية اليسرى.&lt;/li&gt;
&lt;li&gt;استخدم محول الوضع للتبديل بين التصميم أولاً والمواصفات أولاً.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;عند التبديل، تذكّر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;العقد الأساسي مشترك بين الوضعين.&lt;/li&gt;
&lt;li&gt;endpoints والمخططات والأمثلة تبقى كما هي.&lt;/li&gt;
&lt;li&gt;أنت تغيّر سطح التحرير فقط.&lt;/li&gt;
&lt;li&gt;لاستخدام Git في وضع المواصفات أولاً، اربط مستودعًا أولًا.&lt;/li&gt;
&lt;li&gt;بما أن وضع المواصفات أولاً في مرحلة تجريبية، اختبر سلوك المزامنة على مشروع غير حرج قبل اعتماده لعقد إنتاجي.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  مثال قرار سريع
&lt;/h2&gt;

&lt;p&gt;إذا كان فريقك يقول:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"نريد أن يراجع الجميع تصميم API بسهولة."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ابدأ بـ &lt;strong&gt;التصميم أولاً&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;إذا كان فريقك يقول:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"نريد مراجعة كل تغيير في API عبر pull request وتشغيل checks في CI."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;استخدم &lt;strong&gt;المواصفات أولاً&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;إذا كان الفريق مختلطًا، استخدم الاثنين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التصميم أولاً للهيكلة السريعة.&lt;/li&gt;
&lt;li&gt;المواصفات أولاً عند الحاجة إلى Git workflow صارم.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل المواصفات أولاً هي نفسها العقد أولاً؟
&lt;/h3&gt;

&lt;p&gt;في الممارسة، نعم. كلاهما يعني أنك تكتب مواصفات API قبل التنفيذ وتعاملها كمصدر الحقيقة. في Apidog، وضع المواصفات أولاً هو سير عمل عقد أولاً حيث يكون العقد ملف OpenAPI أو Swagger مكتوبًا يدويًا ومتزامنًا مع Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يعمل وضع المواصفات أولاً مع GitLab وAzure DevOps؟
&lt;/h3&gt;

&lt;p&gt;نعم. يدعم وضع المواصفات أولاً المزامنة ثنائية الاتجاه مع GitHub وGitLab مباشرة. ويعمل Azure DevOps عبر اتصال Git عام، مما يسمح بمزامنة ملف المواصفات مع مستودع مستضاف على Azure.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني التبديل من التصميم أولاً إلى المواصفات أولاً دون فقدان عملي؟
&lt;/h3&gt;

&lt;p&gt;نعم. كلا الوضعين يقرآن ويكتبان العقد الأساسي نفسه. عند تبديل الوضع من أسفل يسار وحدة APIs، تبقى نقاط النهاية والمخططات والأمثلة سليمة. أنت تبدل المحرر، وليس البيانات.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;اختر الوضع بناءً على طريقة عمل الفريق، لا بناءً على الأداة فقط:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إذا أردت سرعة وسهولة مشاركة، استخدم &lt;strong&gt;التصميم أولاً&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;إذا أردت Git وPRs وملف مواصفات كمصدر مركزي، استخدم &lt;strong&gt;المواصفات أولاً&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;إذا تغيّرت احتياجاتك، بدّل الوضع من وحدة APIs واستمر على العقد نفسه.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;جرّب بناء endpoint واحدة بالطريقتين، ثم اختر السطح الذي يجعل مراجعة العقد وتحديثه أسهل لفريقك.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ما هو سير عمل API الأصلي لـ Git؟ وكيف تبني واحداً؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 02 Jun 2026 06:25:42 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/m-hw-syr-ml-api-lsly-l-git-wkyf-tbny-whdan-55be</link>
      <guid>https://dev.to/yusuf_khalidd/m-hw-syr-ml-api-lsly-l-git-wkyf-tbny-whdan-55be</guid>
      <description>&lt;p&gt;يعيش الكود الخاص بك في Git. تعيش خطوط أنابيب CI والمراجعات وسجل الإصدارات في Git. لذلك يجب أن تعيش مواصفات API الخاصة بك هناك أيضًا، كملف OpenAPI عادي داخل المستودع.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في سير عمل API الأصلي لـ Git، تتعامل مع ملف &lt;code&gt;openapi.yaml&lt;/code&gt; أو &lt;code&gt;openapi.json&lt;/code&gt; مثل أي ملف كود آخر: تعدّله، تراجعه عبر Pull Request، تشغّل عليه CI، ثم تدمجه. لا تحتاج إلى قاعدة بيانات سحابية منفصلة أو خطوات تصدير/استيراد متكررة.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 يدعم Apidog هذا من خلال وضع Spec-First Mode. يمكنك تصميم API في محرر بأسلوب IDE، ثم مزامنة ملفات OpenAPI الخام ثنائيًا مع GitHub أو GitLab.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ماذا يعني سير عمل API الأصلي لـ Git
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل API الأصلي لـ Git&lt;/a&gt; يعني أن مواصفات API تعيش داخل المستودع بجانب الكود:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo/
├── src/
├── tests/
├── openapi.yaml
└── .github/workflows/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;كل تغيير في العقد يصبح commit يمكن تتبعه ومراجعته.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-10.png" alt="" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هذا يمنحك عمليًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;سجل إصدارات واضح&lt;/strong&gt;: يمكنك معرفة من غيّر نقطة نهاية ومتى باستخدام &lt;code&gt;git log&lt;/code&gt; أو &lt;code&gt;git blame&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مراجعة عبر Pull Requests&lt;/strong&gt;: تظهر تغييرات المسارات، الاستجابات، والـ schemas كـ diff قبل الدمج.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مصدر واحد للحقيقة&lt;/strong&gt;: الملف الموجود في &lt;code&gt;main&lt;/code&gt; هو العقد الذي تقرأ منه الوثائق، الاختبارات، والمحاكاة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال عملي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; api/add-order-status
&lt;span class="c"&gt;# عدّل openapi.yaml&lt;/span&gt;
git diff openapi.yaml
git add openapi.yaml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add order status enum values"&lt;/span&gt;
git push origin api/add-order-status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذه هي الفكرة الأساسية وراء تطوير API الذي يركز على المواصفات: المواصفات تقود، والتطبيق يتبع. لمزيد من التفاصيل، راجع دليل &lt;a href="https://apidog.com/ar/blog/spec-first-api-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير API الذي يركز على المواصفات&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  مشكلة مواصفات API المقيدة بالسحابة
&lt;/h2&gt;

&lt;p&gt;عندما تحتفظ أداة تصميم API بالمواصفات داخل قاعدة بياناتها الخاصة، يصبح “الملف” الذي تعمل عليه غير موجود فعليًا في مستودعك. هذا يسبب احتكاكًا واضحًا في فرق التطوير.&lt;/p&gt;

&lt;p&gt;أبرز المشاكل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;المراجعة تحدث في مكانين&lt;/strong&gt;: الكود في GitHub أو GitLab، والمواصفات في أداة منفصلة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;الفرق غير مرئي بوضوح&lt;/strong&gt;: لا تحصل على diff سطر بسطر داخل Pull Request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;التصدير يصبح خطوة إلزامية&lt;/strong&gt;: تحتاج إلى تصدير المواصفات ثم الالتزام بها يدويًا.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI يحتاج ملفًا على القرص&lt;/strong&gt;: أدوات linting، اختبارات العقود، وتوليد الكود تعمل بشكل أفضل عندما يكون ملف OpenAPI داخل المستودع.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بدلًا من ذلك، اجعل المواصفات ملفًا حقيقيًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم شغّل عليه أدواتك مباشرة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @redocly/cli lint openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi-generator-cli generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; openapi.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; typescript-fetch &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; generated/client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا هو جوهر مفهوم &lt;a href="https://apidog.com/ar/blog/api-spec-as-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مواصفات API ككود&lt;/a&gt;: الملف هو المواصفات، وGit هو التاريخ، وCI هو التنفيذ.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف يعمل وضع Apidog Spec-First Mode
&lt;/h2&gt;

&lt;p&gt;وضع Spec-First Mode مصمم للفرق التي تدير العمل عبر الفروع والالتزامات. بدلًا من تحرير API فقط عبر نماذج مرئية، يمكنك العمل على ملفات YAML أو JSON خام، مع مزامنة ثنائية الاتجاه مع Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. تحرير OpenAPI في محرر بأسلوب IDE
&lt;/h3&gt;

&lt;p&gt;تكتب المواصفات داخل محرر أكواد، مع ميزات تساعدك أثناء التنفيذ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تمييز بناء الجملة لـ YAML وJSON.&lt;/li&gt;
&lt;li&gt;التحقق من صحة OpenAPI وSwagger أثناء الكتابة.&lt;/li&gt;
&lt;li&gt;الإكمال التلقائي للكلمات المفتاحية والأنواع والمراجع.&lt;/li&gt;
&lt;li&gt;عرض الأخطاء مبكرًا قبل وصولها إلى CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. العمل على ملفات YAML/JSON خام
&lt;/h3&gt;

&lt;p&gt;مثال على ملف OpenAPI قابل للإدارة داخل Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1.0&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Orders API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.2.0&lt;/span&gt;

&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{orderId}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get an order by ID&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;getOrder&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orderId&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order found&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Order"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Order&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pending&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;shipped&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;delivered&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الملف هو ما يتم الالتزام به ودفعه إلى Git. لا توجد حقول مخفية أو بيانات وصفية منفصلة لا تراها في المستودع.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. التنقل داخل المواصفات الطويلة
&lt;/h3&gt;

&lt;p&gt;أثناء التحرير، يحلل Apidog ملف OpenAPI ويبني مخططًا تفصيليًا في الشريط الجانبي. يمكنك الانتقال مباشرة إلى:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;paths&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;العمليات مثل &lt;code&gt;getOrder&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;المخططات داخل &lt;code&gt;components.schemas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;الاستجابات والمعاملات&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا مفيد عندما يصبح ملف OpenAPI كبيرًا ويحتوي على عشرات أو مئات نقاط النهاية.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. مزامنة Git ثنائية الاتجاه
&lt;/h3&gt;

&lt;p&gt;يدعم وضع Spec-First Mode مزامنة الملفات مع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;GitLab&lt;/li&gt;
&lt;li&gt;Azure DevOps عبر اتصال Git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;سير العمل العملي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull latest changes
→ Edit OpenAPI file
→ Commit
→ Push
→ Review through PR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا عدّل زميلك نفس ملف المواصفات، يمكنك سحب التغييرات ومراجعة الفروقات كما تفعل مع الكود.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. الالتزام والدفع من داخل Apidog
&lt;/h3&gt;

&lt;p&gt;يمكنك إدارة التغييرات من داخل Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;راجع الملفات المعدلة أو المضافة أو المحذوفة.&lt;/li&gt;
&lt;li&gt;اكتب رسالة commit واضحة.&lt;/li&gt;
&lt;li&gt;ادفع التغيير إلى الفرع المتتبع.&lt;/li&gt;
&lt;li&gt;تحقق من حالة المزامنة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال على رسائل commit جيدة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add 404 response for getOrder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Update Order schema with deliveryStatus field
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;تجنب الرسائل العامة مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Update spec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لشرح مركز حول GitHub، راجع &lt;a href="https://apidog.com/ar/blog/sync-openapi-spec-to-github?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مزامنة مواصفات OpenAPI مع GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  شرح الإعداد
&lt;/h2&gt;

&lt;p&gt;فيما يلي سير إعداد عملي من مستودع إلى مواصفات متزامنة. المرجع الكامل متاح في &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;وثائق وضع Spec-First Mode&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  الخطوة 1: أنشئ مشروعًا من مستودع Git
&lt;/h3&gt;

&lt;p&gt;ابدأ مشروع Spec-First جديدًا في Apidog، ثم اربط مزود Git الخاص بك. اختر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;المستودع الذي يحتوي على ملف OpenAPI.&lt;/li&gt;
&lt;li&gt;الفرع الذي تريد تتبعه، غالبًا &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;ملف المواصفات مثل &lt;code&gt;openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-13.png" alt="" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  الخطوة 2: حرّر المواصفات
&lt;/h3&gt;

&lt;p&gt;افتح ملف OpenAPI وعدّل ما تحتاجه. على سبيل المثال، إضافة استجابة &lt;code&gt;404&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أثناء الكتابة، يساعدك المحرر عبر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التحقق من البنية.&lt;/li&gt;
&lt;li&gt;الإكمال التلقائي.&lt;/li&gt;
&lt;li&gt;تحديث مخطط التنقل الجانبي.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  الخطوة 3: راجع الملفات المتغيرة
&lt;/h3&gt;

&lt;p&gt;يعرض Apidog الملفات التي تغيرت منذ آخر مزامنة، مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modified: openapi.yaml
added: schemas/payment.yaml
deleted: old-spec.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع هذه القائمة قبل الالتزام حتى تعرف بالضبط ما سيدخل إلى Git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-14.png" alt="" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  الخطوة 4: اكتب رسالة commit واضحة
&lt;/h3&gt;

&lt;p&gt;اكتب رسالة تصف التغيير الفني بدقة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add payment schema to OpenAPI spec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rename orderStatus enum values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الخطوة 5: ادفع التغيير
&lt;/h3&gt;

&lt;p&gt;ادفع الالتزام إلى الفرع المتتبع. بعد ذلك يمكن لفريقك فتح Pull Request أو تشغيل CI حسب سير العمل المعتاد.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F06%2Fimage-15.png" alt="" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  الخطوة 6: تحقق من حالة المزامنة
&lt;/h3&gt;

&lt;p&gt;راقب مؤشر حالة المزامنة. عندما يظهر أن الحالة متزامنة، فهذا يعني أن تعديلاتك المحلية والفرع البعيد متطابقان.&lt;/p&gt;

&lt;p&gt;الحلقة الكاملة تصبح:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull → Edit → Commit → Push → Verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بدون تصدير، وبدون مصدر ثانٍ للحقيقة.&lt;/p&gt;

&lt;h2&gt;
  
  
  وضع Spec-First مقابل وضع Design-First
&lt;/h2&gt;

&lt;p&gt;يدعم Apidog طريقتين للعمل. الفرق الأساسي هو مكان تخزين المواصفات وطريقة تحريرها.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;وضع Spec-First، تجريبي&lt;/th&gt;
&lt;th&gt;وضع Design-First&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;تخزين المواصفات&lt;/td&gt;
&lt;td&gt;ملفات YAML/JSON خام في Git&lt;/td&gt;
&lt;td&gt;مشروع Apidog السحابي&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;المحرر الأساسي&lt;/td&gt;
&lt;td&gt;محرر أكواد بأسلوب IDE&lt;/td&gt;
&lt;td&gt;واجهة مستخدم بصرية تعتمد على النماذج&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التحكم في الإصدارات&lt;/td&gt;
&lt;td&gt;Git أصلي: commits، branches، diffs&lt;/td&gt;
&lt;td&gt;سجل Apidog وفروعه&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مزامنة Git ثنائية الاتجاه&lt;/td&gt;
&lt;td&gt;نعم: GitHub، GitLab، Azure DevOps&lt;/td&gt;
&lt;td&gt;عبر التصدير/الاستيراد&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;الأفضل لـ&lt;/td&gt;
&lt;td&gt;الفرق التي تعتمد على Git في المراجعة والإصدار&lt;/td&gt;
&lt;td&gt;الفرق التي تفضل التصميم المرئي&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;اختر Spec-First إذا كان فريقك يراجع كل شيء عبر Pull Requests ويحتاج إلى ملفات OpenAPI داخل المستودع. اختر Design-First إذا كان فريقك يفضل واجهة مرئية ولا يعمل مباشرة على YAML أو JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تستخدم وضع Spec-First
&lt;/h2&gt;

&lt;p&gt;استخدم وضع Spec-First عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تريد أن تمر مواصفات API عبر Pull Requests.&lt;/li&gt;
&lt;li&gt;تحتاج إلى &lt;code&gt;git blame&lt;/code&gt; وسجل commits لعقد API.&lt;/li&gt;
&lt;li&gt;يشغّل CI لديك linting أو contract tests أو code generation.&lt;/li&gt;
&lt;li&gt;يعمل عدة مهندسين على نفس المواصفات وتحتاج إلى diffs قابلة للمراجعة.&lt;/li&gt;
&lt;li&gt;تريد إلغاء خطوة التصدير من أداة إلى أخرى.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال على CI بسيط لفحص المواصفات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OpenAPI Check&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi.yaml"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lint-openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lint OpenAPI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx @redocly/cli lint openapi.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا الشكل، أي تغيير في العقد يتم فحصه قبل الدمج.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ما هو سير عمل API الأصلي لـ Git؟
&lt;/h3&gt;

&lt;p&gt;هو سير عمل يخزن مواصفات OpenAPI كملف داخل مستودع Git، ويدير كل تغيير عبر commits وbranches وPull Requests. تتبع المواصفات نفس عملية المراجعة والتحكم في الإصدار مثل كود التطبيق.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يدعم Apidog Spec-First Mode GitHub وGitLab؟
&lt;/h3&gt;

&lt;p&gt;نعم. يقوم وضع Spec-First بالمزامنة ثنائيًا مع GitHub وGitLab مباشرة. كما يدعم Azure DevOps عبر اتصال Git. تختار المستودع والفرع، ثم يحافظ Apidog على مزامنة تعديلاتك مع البعيد.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني تحرير ملفات OpenAPI كـ YAML أو JSON خام؟
&lt;/h3&gt;

&lt;p&gt;نعم. يوفر وضع Spec-First محررًا بأسلوب IDE لملفات YAML وJSON الخام، مع تمييز بناء الجملة، والتحقق من صحة المخطط، والإكمال التلقائي لـ OpenAPI وSwagger.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما الفرق بين وضع Spec-First وDesign-First؟
&lt;/h3&gt;

&lt;p&gt;يحافظ وضع Spec-First على المواصفات كملفات داخل Git ويحررها في محرر أكواد مع مزامنة ثنائية الاتجاه. يحافظ وضع Design-First على المواصفات داخل مشروع Apidog السحابي مع محرر مرئي يعتمد على النماذج.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخاتمة
&lt;/h2&gt;

&lt;p&gt;سير عمل API الأصلي لـ Git يزيل الانقسام بين الكود وعقد API. تصبح المواصفات ملفًا، والملف commit، والـ commit يمر عبر نفس عملية المراجعة التي يستخدمها فريقك بالفعل.&lt;/p&gt;

&lt;p&gt;يمنحك Apidog Spec-First Mode طريقة عملية لتنفيذ ذلك: تحرير YAML أو JSON خام، مراجعة الفروقات، كتابة رسالة commit واضحة، الدفع إلى Git، ثم متابعة الحالة حتى تتم المزامنة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;جرّب وضع Spec-First&lt;/a&gt; وأعد مواصفات API الخاصة بك إلى Git.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>كيفية استخدام Codex مع GPT-5.5 مجاناً (غير محدود حتى أغسطس 2026)</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Mon, 01 Jun 2026 09:10:52 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-stkhdm-codex-m-gpt-55-mjnan-gyr-mhdwd-ht-gsts-2026-1n68</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-stkhdm-codex-m-gpt-55-mjnan-gyr-mhdwd-ht-gsts-2026-1n68</guid>
      <description>&lt;p&gt;توثّق &lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; طريقة مباشرة لاستخدام كتالوج نماذجها داخل Codex CLI: حساب Pro، مفتاح API، وخمس علامات تهيئة. النتيجة العملية هي تشغيل GPT-5.5 وClaude Opus 4.7 وDeepSeek V4-Pro وKimi K2.6 ونماذج أخرى من داخل Codex، ضمن عرض الاستدلال غير المحدود حتى أغسطس 2026 وبحسب سياسة الاستخدام العادل لدى Pioneer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  باختصار
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;العرض:&lt;/strong&gt; حسابات &lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; الاحترافية تحصل على استدلال غير محدود عبر كتالوج النماذج حتى أغسطس 2026. تكامل Codex موثّق رسميًا.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;النماذج المتاحة:&lt;/strong&gt; GPT-5.5، GPT-4.1، Claude Opus 4.7، Claude Sonnet 4.6، DeepSeek V4-Pro، Kimi K2.6، Qwen3 32B، Llama، Gemma، Nemotron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;الإعداد:&lt;/strong&gt; خمس علامات &lt;code&gt;-c&lt;/code&gt; في Codex CLI + متغير البيئة &lt;code&gt;PIONEER_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تبديل النماذج:&lt;/strong&gt; استخدم &lt;code&gt;/model&lt;/code&gt; داخل Codex لاختيار النموذج للمطالبة التالية.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;المحاذير:&lt;/strong&gt; العرض ينتهي في أغسطس 2026، التكامل يستخدم Responses API وليس Chat Completions، وتركيز Pioneer الأساسي هو تدريب النماذج المتخصصة لا الاستدلال الخام.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ما هي Pioneer.ai؟
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; منصة بنية تحتية للذكاء الاصطناعي تحدد أين تفشل نماذج اللغة في حركة مرورك الإنتاجية، ثم تدرب نماذج متخصصة أصغر لمعالجة هذه الفجوات.&lt;/p&gt;

&lt;p&gt;واجهة الاستدلال الموحدة هي ما يجعل تكامل Codex ممكنًا. تمرر طلباتك عبر بوابة Pioneer، ما يسمح للمنصة بتحليل نقاط ضعف النماذج الأساسية وتغذية مسار تدريب النماذج المتخصصة.&lt;/p&gt;

&lt;p&gt;بالنسبة للمطور، النتيجة العملية واضحة: حساب Pro يعمل كبوابة متعددة النماذج بدون فواتير لكل رمز حتى الموعد النهائي.&lt;/p&gt;

&lt;h2&gt;
  
  
  النماذج المتاحة عبر Pioneer
&lt;/h2&gt;

&lt;p&gt;كتالوج Pioneer في مايو 2026 ينقسم إلى ثلاث فئات.&lt;/p&gt;

&lt;h3&gt;
  
  
  نماذج استدلال احتكارية
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GPT-5.5&lt;/li&gt;
&lt;li&gt;GPT-4.1&lt;/li&gt;
&lt;li&gt;Claude Opus 4.7&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4.6&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  نماذج فك تشفير بأوزان مفتوحة
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek V4-Pro&lt;/li&gt;
&lt;li&gt;Kimi K2.6&lt;/li&gt;
&lt;li&gt;Qwen3 32B&lt;/li&gt;
&lt;li&gt;Llama&lt;/li&gt;
&lt;li&gt;Gemma&lt;/li&gt;
&lt;li&gt;Nemotron&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  نماذج تشفير ومتخصصة
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GLiNER2 Large&lt;/li&gt;
&lt;li&gt;GLiGuard 300M&lt;/li&gt;
&lt;li&gt;GLiNER2-PII&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لسير عمل Codex، ستتعامل غالبًا مع نماذج فك التشفير. GPT-5.5 مناسب للمراجعة، Claude Opus 4.7 للتصميم والتخطيط، DeepSeek V4-Pro لتوليد الكود بكثافة، وKimi K2.6 لحلقات الوكلاء طويلة السياق.&lt;/p&gt;

&lt;p&gt;للمقارنة مع نماذج أخرى، راجع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/deepseek-v4-pro-permanent-price-cut?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تحليل خفض سعر DeepSeek V4-Pro الدائم&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/chinese-llm-price-war-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;حرب أسعار LLM الصينية لعام 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  المتطلبات الأساسية
&lt;/h2&gt;

&lt;p&gt;قبل البدء، تأكد من توفر الآتي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Codex CLI مثبت ومحدث.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا لم يكن مثبتًا، اتبع &lt;a href="https://developers.openai.com/codex/" rel="noopener noreferrer"&gt;وثائق Codex CLI الرسمية&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;حساب &lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; Pro ومفتاح API.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;أنشئ حسابًا عبر &lt;a href="http://pioneer.ai" rel="noopener noreferrer"&gt;pioneer.ai&lt;/a&gt;، ثم انتقل إلى لوحة المصادقة &lt;code&gt;/authentication&lt;/code&gt; وأنشئ مفتاح API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;صدفة تدعم متغيرات البيئة.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bash أو Zsh أو Fish أو PowerShell كافية. ستحتاج إلى تمرير المفتاح عبر &lt;code&gt;PIONEER_API_KEY&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: إنشاء مفتاح API من Pioneer
&lt;/h2&gt;

&lt;p&gt;افتح لوحة تحكم Pioneer، ثم انتقل إلى &lt;strong&gt;Authentication&lt;/strong&gt; وأنشئ مفتاحًا جديدًا لاستخدامه مع Codex CLI.&lt;/p&gt;

&lt;p&gt;عادةً تبدأ مفاتيح Pioneer بالبادئة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pio_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;صدّر المفتاح في الطرفية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PIONEER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"pio_yourkeyhere"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لجعله دائمًا، أضف السطر إلى ملف الصدفة المناسب:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# zsh&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PIONEER_API_KEY="pio_yourkeyhere"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc

&lt;span class="c"&gt;# bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PIONEER_API_KEY="pio_yourkeyhere"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم أعد تحميل الملف:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;span class="c"&gt;# أو&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 2: تحديث Codex CLI
&lt;/h2&gt;

&lt;p&gt;يستخدم تكامل Pioneer واجهة &lt;code&gt;responses&lt;/code&gt;، لذلك تحتاج إلى إصدار Codex يدعم موفري النماذج المخصصة مع إعداد &lt;code&gt;wire_api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;تحقق من الإصدار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;حدّث Codex إذا كان لديك إصدار قديم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تثبته لأول مرة، راجع &lt;a href="https://developers.openai.com/codex/" rel="noopener noreferrer"&gt;وثائق تثبيت Codex CLI&lt;/a&gt; حسب نظامك.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 3: تشغيل Codex عبر Pioneer
&lt;/h2&gt;

&lt;p&gt;نفّذ الأمر التالي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PIONEER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PIONEER_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; codex &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_provider="pioneer"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_providers.pioneer.name="Pioneer"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_providers.pioneer.base_url="https://api.pioneer.ai/v1"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_providers.pioneer.wire_api="responses"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_providers.pioneer.env_key="PIONEER_API_KEY"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;معنى كل خيار:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الخيار&lt;/th&gt;
&lt;th&gt;الوظيفة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_provider="pioneer"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;يجعل Codex يستخدم مزودًا مخصصًا باسم &lt;code&gt;pioneer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_providers.pioneer.name="Pioneer"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;اسم العرض داخل Codex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_providers.pioneer.base_url="https://api.pioneer.ai/v1"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;نقطة نهاية Pioneer المتوافقة مع OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_providers.pioneer.wire_api="responses"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;يجبر Codex على استخدام Responses API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model_providers.pioneer.env_key="PIONEER_API_KEY"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;يحدد متغير البيئة المستخدم للمصادقة&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;السطر الأهم هو:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'model_providers.pioneer.wire_api="responses"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بدونه قد يحاول Codex استخدام Chat Completions، ما يؤدي إلى فشل الطلبات.&lt;/p&gt;

&lt;h2&gt;
  
  
  إعداد دائم في Codex
&lt;/h2&gt;

&lt;p&gt;بدل تمرير علامات &lt;code&gt;-c&lt;/code&gt; في كل مرة، يمكنك نقل الإعداد إلى ملف تكوين Codex.&lt;/p&gt;

&lt;p&gt;حسب إصدارك، سيكون الملف غالبًا أحد التاليين:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.codex/config.toml
~/.codex/config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال TOML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;model_provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"pioneer"&lt;/span&gt;

&lt;span class="nn"&gt;[model_providers.pioneer]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pioneer"&lt;/span&gt;
&lt;span class="py"&gt;base_url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://api.pioneer.ai/v1"&lt;/span&gt;
&lt;span class="py"&gt;wire_api&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"responses"&lt;/span&gt;
&lt;span class="py"&gt;env_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"PIONEER_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعدها شغّل Codex مباشرة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 4: تبديل النماذج داخل Codex
&lt;/h2&gt;

&lt;p&gt;بعد تشغيل Codex عبر Pioneer، استخدم الأمر &lt;code&gt;/model&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model gpt-5.5
/model claude-opus-4.7
/model deepseek-v4-pro
/model kimi-k2.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال عملي لسير عمل ترميز:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model claude-opus-4.7
صمّم بنية ميزة المصادقة متعددة العوامل في هذا المشروع.

/model deepseek-v4-pro
نفّذ الخطة في الملفات الحالية مع اختبارات وحدة.

/model gpt-5.5
راجع التغييرات وابحث عن أخطاء أمنية أو حالات طرفية مفقودة.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يمرر Codex اسم النموذج إلى Pioneer، ثم تقوم Pioneer بتوجيه الطلب إلى المزود الأساسي وإرجاع الاستجابة.&lt;/p&gt;

&lt;p&gt;للحصول على قائمة معرفات النماذج المحدثة، راجع &lt;a href="https://docs.pioneer.ai/api-reference/coding-agent-integration#codex" rel="noopener noreferrer"&gt;وثائق تكامل وكيل الترميز Pioneer.ai&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  أنماط استخدام عملية داخل Codex
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. التخطيط باستخدام Claude Opus 4.7
&lt;/h3&gt;

&lt;p&gt;استخدمه عندما تحتاج إلى تفكير معماري أو تقسيم مهمة كبيرة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model claude-opus-4.7
اقرأ بنية المشروع واقترح خطة لترحيل طبقة المصادقة إلى OAuth2.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للمقارنة، راجع &lt;a href="https://apidog.com/ar/blog/claude-vs-codex-comparison-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مقارنة Claude Code vs OpenAI Codex في 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. توليد الكود باستخدام DeepSeek V4-Pro
&lt;/h3&gt;

&lt;p&gt;استخدمه بعد تثبيت المواصفات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model deepseek-v4-pro
نفّذ الخطة السابقة، أضف الاختبارات، ولا تغيّر الواجهات العامة إلا عند الضرورة.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع أيضًا &lt;a href="https://apidog.com/ar/blog/deepseek-v4-pro-permanent-price-cut?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;خفض سعر DeepSeek V4-Pro بنسبة 75% أصبح دائمًا&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. مراجعة الكود باستخدام GPT-5.5
&lt;/h3&gt;

&lt;p&gt;استخدمه قبل الالتزام بالتغييرات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model gpt-5.5
راجع diff الحالي. ركّز على الأخطاء المنطقية، مشاكل التزامن، والثغرات الأمنية.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع &lt;a href="https://openai.com/index/introducing-gpt-5-5/" rel="noopener noreferrer"&gt;ملاحظات إطلاق GPT-5.5 الرسمية&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. حلقات الوكلاء باستخدام Kimi K2.6
&lt;/h3&gt;

&lt;p&gt;استخدمه للمهام طويلة السياق أو التي تعتمد على استدعاء الأدوات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model kimi-k2.6
افحص فشل اختبارات CI، حدّد السبب، واقترح أقل تعديل ممكن.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للتفاصيل، راجع &lt;a href="https://apidog.com/ar/blog/kimi-k2-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أسعار Kimi K2 API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا هذا مسار نظيف لاستخدام Codex بدون فواتير لكل رمز؟
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. العرض غير محدود حتى أغسطس 2026
&lt;/h3&gt;

&lt;p&gt;معظم المسارات المجانية تعتمد على رصيد أو حصص أسبوعية. هنا القيد الأساسي هو سياسة الاستخدام العادل ونافذة العرض الزمنية.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. عدة نماذج خلف إعداد واحد
&lt;/h3&gt;

&lt;p&gt;بدل إعداد مفاتيح متعددة لكل مزود، تستخدم مفتاح Pioneer واحدًا وتبدّل داخل Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model gpt-5.5
/model claude-opus-4.7
/model deepseek-v4-pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للمسارات الأخرى، راجع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/how-to-use-gpt-5-5-free-codex?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام GPT-5.5 مجانًا مع Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/use-codex-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;4 طرق مشروعة لاستخدام Codex مجانًا&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. تكامل موثق وليس اختراقًا
&lt;/h3&gt;

&lt;p&gt;لا تحتاج إلى خادم وسيط أو تعديل ثنائي. الإعداد منشور في وثائق Pioneer كمسار مدعوم.&lt;/p&gt;

&lt;p&gt;لمطوري المصادر المفتوحة، راجع أيضًا &lt;a href="https://apidog.com/ar/blog/free-codex-open-source?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Codex مجاني لمطوري المصادر المفتوحة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pioneer.ai مقابل مسارات Codex المجانية الأخرى
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الطريقة&lt;/th&gt;
&lt;th&gt;النماذج&lt;/th&gt;
&lt;th&gt;الحد الأقصى&lt;/th&gt;
&lt;th&gt;وقت الإعداد&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Plus + Codex Cloud&lt;/td&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;حصص Plus&lt;/td&gt;
&lt;td&gt;0 دقائق&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;منحة OpenAI للطبقة المجانية&lt;/td&gt;
&lt;td&gt;GPT-5.x&lt;/td&gt;
&lt;td&gt;اعتمادات المنحة&lt;/td&gt;
&lt;td&gt;موافقة خلال يوم واحد&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;برنامج منح المصادر المفتوحة&lt;/td&gt;
&lt;td&gt;GPT-5.5 + Codex&lt;/td&gt;
&lt;td&gt;للمشاريع المعتمدة فقط&lt;/td&gt;
&lt;td&gt;التقديم + المراجعة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تجربة مجانية على بوابة طرف ثالث&lt;/td&gt;
&lt;td&gt;يختلف&lt;/td&gt;
&lt;td&gt;رصيد التجربة&lt;/td&gt;
&lt;td&gt;5 دقائق&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10 نماذج: GPT-5.5، Claude، DeepSeek، Kimi، وغيرها&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;غير محدود حتى أغسطس 2026&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5 دقائق&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pioneer تتفوق في اتساع النماذج ونافذة الاستخدام غير المحدودة. المسارات الأخرى قد تكون أفضل إذا كنت تحتاج إلى التزام طويل الأجل لا ينتهي في أغسطس 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  محاذير قبل الاعتماد عليها
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;الموعد النهائي حقيقي:&lt;/strong&gt; العرض ينتهي في أغسطس 2026، ولا يوجد التزام مذكور بالتمديد.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responses API وليس Chat Completions:&lt;/strong&gt; تكامل Codex يستخدم تنسيق Responses API. إذا كنت تبني سكربتات حول الطلبات الخام، انتبه لاختلاف الشكل.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;زمن استجابة إضافي:&lt;/strong&gt; الطلب يمر عبر Pioneer ثم إلى المزود الأساسي. توقّع قفزة إضافية مقارنة بالاتصال المباشر.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;الكتالوج قد يتغير:&lt;/strong&gt; قد تزيل Pioneer نموذجًا من الكتالوج إذا تغيرت شروط المزودين أو الأسعار.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pioneer تركّز على التدريب:&lt;/strong&gt; الاستدلال مدعوم، لكن المنتج الأساسي هو تدريب النماذج المتخصصة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  اختبار إعداد Pioneer باستخدام Apidog
&lt;/h2&gt;

&lt;p&gt;بعد ربط Codex، اختبر البوابة مباشرة على مستوى API. هذا يساعدك على عزل المشكلة إذا فشل &lt;code&gt;/model&lt;/code&gt; داخل Codex.&lt;/p&gt;

&lt;p&gt;يتعامل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; مع Pioneer مثل أي واجهة متوافقة مع OpenAI.&lt;/p&gt;

&lt;p&gt;استخدم نقطة النهاية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.pioneer.ai/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وأضف الهيدر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer $PIONEER_API_KEY
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال جسم طلب:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"اكتب دالة JavaScript تتحقق من صحة بريد إلكتروني."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;باستخدام Apidog يمكنك:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التحقق من استجابة كل نموذج في الكتالوج.&lt;/li&gt;
&lt;li&gt;مقارنة نفس الإدخال بين GPT-5.5 وClaude Opus 4.7 وDeepSeek V4-Pro.&lt;/li&gt;
&lt;li&gt;اكتشاف اختلافات التنسيق بين Responses API وChat Completions.&lt;/li&gt;
&lt;li&gt;إنشاء مجموعة اختبارات انحدار لمراقبة تغيّر سلوك النماذج.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ابدأ من &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنزيل Apidog&lt;/a&gt;، ثم استورد مخطط OpenAI Chat Completion، وغيّر عنوان URL الأساسي إلى Pioneer.&lt;/p&gt;

&lt;p&gt;راجع أيضًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/chinese-llm-price-war-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;مقارنة حرب أسعار LLM الصينية لعام 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/ar/blog/how-to-use-deepseek-v4-pro-with-cursor?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام DeepSeek V4-Pro مع Cursor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  أين يترك هذا مكدسك؟
&lt;/h2&gt;

&lt;p&gt;اقتران &lt;a href="http://Pioneer.ai" rel="noopener noreferrer"&gt;Pioneer.ai&lt;/a&gt; مع Codex يمنحك بوابة متعددة النماذج داخل سير عمل الترميز بتكوين واحد. قوته في البساطة: مفتاح API واحد، إعداد Codex واحد، وتبديل نماذج بالأمر &lt;code&gt;/model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;خطواتك التالية:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ حساب Pioneer Pro ومفتاح API.&lt;/li&gt;
&lt;li&gt;اربط Codex باستخدام إعداد &lt;code&gt;wire_api="responses"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;اختبر النماذج التي تعتمد عليها داخل Codex.&lt;/li&gt;
&lt;li&gt;أنشئ مجموعة اختبار في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; ضد نقطة نهاية Pioneer.&lt;/li&gt;
&lt;li&gt;جهّز خطة بديلة قبل أغسطس 2026.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الموعد النهائي هو القيد الأساسي. استخدم النافذة الحالية لتقليل تكلفة التجارب، لكن لا تبنِ اعتمادًا إنتاجيًا بلا مسار خروج.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>مقارنة أفضل نماذج الترميز مفتوحة المصدر 2026: MiniMax M3 ضد DeepSeek V4-pro ضد Qwen 3.7</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Mon, 01 Jun 2026 06:16:50 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/mqrn-fdl-nmdhj-ltrmyz-mftwh-lmsdr-2026-minimax-m3-dd-deepseek-v4-pro-dd-qwen-37-3gck</link>
      <guid>https://dev.to/yusuf_khalidd/mqrn-fdl-nmdhj-ltrmyz-mftwh-lmsdr-2026-minimax-m3-dd-deepseek-v4-pro-dd-qwen-37-3gck</guid>
      <description>&lt;p&gt;على مدار العامين الماضيين، كان اختيار نموذج برمجة عملي يعني غالبًا الاختيار بين GPT أو Claude أو Gemini، ثم قبول تكلفة الرموز، وواجهة API مغلقة، وأوزان غير متاحة. في 2026 تغيّر الوضع: MiniMax M3 وDeepSeek V4-Pro وQwen 3.7 يقدّمون بدائل قوية للبرمجة والوكلاء، مع اختلافات مهمة في الأوزان المفتوحة، تكلفة التشغيل، نافذة السياق، ودعم الأدوات.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;إذا كنت تبني وكيل برمجة، مساعد مراجعة كود، أو نظامًا يقرأ مستودعات كاملة، فلا تختَر النموذج بناءً على لوحة متصدرين فقط. اختبر نفس عبء العمل على النماذج الثلاثة، وقارن جودة التصحيح، استهلاك الرموز، شكل &lt;code&gt;tool_calls&lt;/code&gt;، وثبات المخرجات.&lt;/p&gt;

&lt;h2&gt;
  
  
  المنافسون الثلاثة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MiniMax M3
&lt;/h3&gt;

&lt;p&gt;MiniMax M3 هو الوافد الأحدث. أُعلن عنه كنموذج برمجة ووكلاء مع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نافذة سياق بحجم 1,000,000 رمز مميز.&lt;/li&gt;
&lt;li&gt;دعم وسائط متعددة أصلي: صورة، فيديو، واستخدام الكمبيوتر.&lt;/li&gt;
&lt;li&gt;بنية MSA.&lt;/li&gt;
&lt;li&gt;أوزان مفتوحة وتقرير تقني مخطط نشرهما بعد الإطلاق.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استخدمه كخيار أول إذا كان عبء العمل لديك يحتاج إلى سياق طويل جدًا أو مدخلات متعددة الوسائط. التفاصيل الكاملة متوفرة في &lt;a href="https://apidog.com/ar/blog/what-is-minimax-m3?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ما هو MiniMax M3&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepSeek V4-Pro
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4-Pro مناسب عندما تكون التكلفة وجودة التفكير في الكود أهم من الوسائط المتعددة. ميزته العملية هي إرجاع محتوى التفكير عبر &lt;code&gt;reasoning_content&lt;/code&gt; قبل الإجابة النهائية، ما يساعد في مهام مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إعادة هيكلة ملفات متعددة.&lt;/li&gt;
&lt;li&gt;تتبع تغييرات التواقيع بين الدوال.&lt;/li&gt;
&lt;li&gt;فهم تبعيات مشروع كبير.&lt;/li&gt;
&lt;li&gt;إصلاح أخطاء تتطلب أكثر من تعديل واحد.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يدير DeepSeek موقعه الرسمي وواجهة API على &lt;a href="https://www.deepseek.com" rel="noopener noreferrer"&gt;deepseek.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qwen 3.7
&lt;/h3&gt;

&lt;p&gt;Qwen3.7-Max-Preview هو نموذج Alibaba الرائد في هذه المقارنة. قوته الأساسية في التفكير المركب وتشغيل الوكلاء طويل المدى. لكنه، حتى وقت الإطلاق المذكور هنا، مغلق الأوزان، لذلك لا يناسبك إذا كان شرطك الأساسي هو الاستضافة الذاتية اليوم.&lt;/p&gt;

&lt;p&gt;التفاصيل الكاملة موجودة في &lt;a href="https://apidog.com/ar/blog/what-is-qwen-3-7?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ما هو Qwen 3.7&lt;/a&gt;. مستودعات Alibaba مفتوحة المصدر موجودة على &lt;a href="https://github.com/QwenLM" rel="noopener noreferrer"&gt;github.com/QwenLM&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  جدول المواصفات
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المواصفة&lt;/th&gt;
&lt;th&gt;MiniMax M3&lt;/th&gt;
&lt;th&gt;DeepSeek V4-Pro&lt;/th&gt;
&lt;th&gt;Qwen3.7-Max-Preview&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;المورد&lt;/td&gt;
&lt;td&gt;MiniMax&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;Alibaba (Qwen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تاريخ الإصدار&lt;/td&gt;
&lt;td&gt;1 يونيو 2026&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;مايو 2026 (معاينة)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;أوزان مفتوحة&lt;/td&gt;
&lt;td&gt;نعم، مع نشر الأوزان خلال ~10 أيام من الإطلاق&lt;/td&gt;
&lt;td&gt;نعم، وفق سجل DeepSeek عبر R1/V3&lt;/td&gt;
&lt;td&gt;ليس بعد، النموذج الرائد مغلق الأوزان&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;نافذة السياق&lt;/td&gt;
&lt;td&gt;1,000,000 رمز مميز&lt;/td&gt;
&lt;td&gt;لم يُذكر هنا&lt;/td&gt;
&lt;td&gt;1,000,000 رمز مميز&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;متعدد الوسائط&lt;/td&gt;
&lt;td&gt;نعم: صورة + فيديو + استخدام الكمبيوتر&lt;/td&gt;
&lt;td&gt;لا، نص + تفكير&lt;/td&gt;
&lt;td&gt;تفكير يركز على النص&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;وضع التفكير&lt;/td&gt;
&lt;td&gt;نعم&lt;/td&gt;
&lt;td&gt;نعم، عبر &lt;code&gt;reasoning_content&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;نعم، تفكير موسع&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;عدد المعلمات&lt;/td&gt;
&lt;td&gt;لم يُكشف عنه&lt;/td&gt;
&lt;td&gt;لم يُكشف عنه هنا&lt;/td&gt;
&lt;td&gt;لم يُكشف عنه هنا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;البنية&lt;/td&gt;
&lt;td&gt;MSA&lt;/td&gt;
&lt;td&gt;لم تُذكر هنا&lt;/td&gt;
&lt;td&gt;لم تُذكر هنا&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;إذا كانت الأوزان المفتوحة شرطًا غير قابل للتفاوض، فابدأ بـ MiniMax M3 أو DeepSeek V4-Pro. لا تعتمد على Qwen3.7-Max للاستضافة الذاتية حاليًا لأنه مغلق الأوزان.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تقارن قوة البرمجة عمليًا؟
&lt;/h2&gt;

&lt;p&gt;لا تبدأ بسؤال: "أي نموذج أفضل؟"&lt;/p&gt;

&lt;p&gt;ابدأ بسؤال أدق:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;هل أحتاج إصلاح أخطاء GitHub حقيقية؟&lt;/li&gt;
&lt;li&gt;هل أحتاج تشغيل أوامر في الطرفية؟&lt;/li&gt;
&lt;li&gt;هل أحتاج وكيلًا يستدعي أدوات؟&lt;/li&gt;
&lt;li&gt;هل أحتاج قراءة مستودع كامل؟&lt;/li&gt;
&lt;li&gt;هل أحتاج إدخال صور أو فيديو؟&lt;/li&gt;
&lt;li&gt;هل أحتاج أقل تكلفة لكل مليون رمز؟&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;أطلقت MiniMax M3 مع معايير برمجة ووكلاء منشورة من المورد. تعامل معها كأرقام يوم إطلاق إلى أن يعيد طرف ثالث إنتاجها:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المعيار، مُبلغ عنه من MiniMax&lt;/th&gt;
&lt;th&gt;MiniMax M3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SWE-Bench Pro&lt;/td&gt;
&lt;td&gt;59.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-Bench 2.1&lt;/td&gt;
&lt;td&gt;66.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-fficiency&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KernelBench Hard&lt;/td&gt;
&lt;td&gt;28.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP Atlas&lt;/td&gt;
&lt;td&gt;74.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostTrainBench&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG-Bench&lt;/td&gt;
&lt;td&gt;مُبلغ عنه أعلى من Opus 4.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OmniDocBench&lt;/td&gt;
&lt;td&gt;مُبلغ عنه أعلى من Gemini 3.1 Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claw-Eval&lt;/td&gt;
&lt;td&gt;مُبلغ عنه كالأعلى في مجموعته&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;تغطي SWE-Bench Pro وTerminal-Bench سيناريوهات قريبة من العمل الحقيقي: إصلاح مشكلات، تعديل ملفات، وتشغيل أوامر. يمكنك التحقق من مجال SWE-Bench عبر &lt;a href="https://www.swebench.com" rel="noopener noreferrer"&gt;لوحة المتصدرين SWE-Bench&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;بالنسبة لـ DeepSeek V4-Pro وQwen 3.7، لا توجد هنا أرقام منشورة بنفس التنسيق لكل معيار، لذلك المقارنة الخلوية المباشرة ستكون غير دقيقة. استخدم هذا التقسيم العملي بدلًا من ذلك:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;اختر &lt;strong&gt;MiniMax M3&lt;/strong&gt; إذا أردت أدلة برمجة وكيلية منشورة، وسياقًا طويلًا، ووسائط متعددة.&lt;/li&gt;
&lt;li&gt;اختر &lt;strong&gt;DeepSeek V4-Pro&lt;/strong&gt; إذا أردت جودة كود مدفوعة بالتفكير مع تكلفة منخفضة جدًا.&lt;/li&gt;
&lt;li&gt;اختر &lt;strong&gt;Qwen3.7-Max&lt;/strong&gt; إذا أردت نموذجًا قويًا للمهام الطويلة عبر API مستضاف وكنت لا تحتاج إلى أوزان مفتوحة الآن.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لإعداد DeepSeek V4-Pro داخل Cursor، راجع &lt;a href="https://apidog.com/ar/blog/how-to-use-deepseek-v4-pro-with-cursor?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام DeepSeek V4-Pro مع Cursor&lt;/a&gt;. ولمقارنة أوسع بين النماذج الرائدة، راجع &lt;a href="https://apidog.com/ar/blog/qwen-3-7-vs-gpt-5-5-vs-opus-4-7?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Qwen 3.7 مقابل GPT-5.5 مقابل Opus 4.7&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  نافذة السياق: متى تحتاج مليون رمز فعلًا؟
&lt;/h2&gt;

&lt;p&gt;MiniMax M3 وQwen3.7-Max يعلنان عن نافذة سياق بحجم 1,000,000 رمز مميز. هذا يعادل تقريبًا 700,000 إلى 750,000 كلمة.&lt;/p&gt;

&lt;p&gt;هذا مفيد في حالات مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إدخال مستودع متوسط كامل في طلب واحد.&lt;/li&gt;
&lt;li&gt;تحليل وثائق طويلة بدون طبقة RAG.&lt;/li&gt;
&lt;li&gt;مراجعة سجل محادثات طويل.&lt;/li&gt;
&lt;li&gt;تشغيل وكيل يحتاج إلى ذاكرة عمل كبيرة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لكن لا تستخدم مليون رمز بشكل افتراضي. كل رمز ترسله يدخل في الفاتورة، والسياق الكبير لا يضمن دائمًا استدعاءً مثاليًا للمعلومات.&lt;/p&gt;

&lt;p&gt;قاعدة عملية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;إذا كان السؤال يحتاج 5 ملفات، لا ترسل المستودع كاملًا.
إذا كان يحتاج واجهات API فقط، أرسل ملفات التعريف والاختبارات.
إذا كان يحتاج إعادة هيكلة شاملة، أرسل شجرة المشروع والملفات المتأثرة فقط أولًا.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال بنية موجه أكثر كفاءة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;المهمة:
أعد هيكلة AuthService لاستخدام TokenProvider الجديد.

السياق:
- شجرة الملفات المختصرة
- AuthService.ts
- TokenProvider.ts
- الاختبارات الحالية
- أي ملفات تستدعي AuthService

المطلوب:
1. اذكر خطة التعديل.
2. اكتب الملفات التي يجب تغييرها.
3. أرجع diff فقط.
4. لا تعدّل ملفات غير مذكورة.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;توجد تكتيكات عملية لتقليل تكلفة السياق في &lt;a href="https://apidog.com/ar/blog/how-to-reduce-agent-token-costs-cli?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية تقليل تكاليف رموز الوكيل&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  السعر والوصول
&lt;/h2&gt;

&lt;p&gt;السعر هو سبب أهمية هذه المقارنة. نفس الوكيل الذي يكون مكلفًا على نموذج رائد غربي يمكن تشغيله هنا بجزء كبير من التكلفة. هذا جزء من &lt;a href="https://apidog.com/ar/blog/chinese-llm-price-war-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;حرب أسعار LLM الصينية 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepSeek V4-Pro
&lt;/h3&gt;

&lt;p&gt;DeepSeek V4-Pro يملك أوضح تسعير منشور هنا:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;نوع الرمز المميز&lt;/th&gt;
&lt;th&gt;سعر DeepSeek V4-Pro لكل مليون رمز مميز&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;المدخل، خطأ في ذاكرة التخزين المؤقت&lt;/td&gt;
&lt;td&gt;0.435 دولار&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;المدخل، إصابة ذاكرة التخزين المؤقت&lt;/td&gt;
&lt;td&gt;0.003625 دولار&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;المخرج&lt;/td&gt;
&lt;td&gt;0.87 دولار&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;نسخة V4-Flash غير المفكرة أرخص: 0.14 دولار / 0.28 دولار لكل مليون رمز مدخل / مخرج.&lt;/p&gt;

&lt;h3&gt;
  
  
  MiniMax M3
&lt;/h3&gt;

&lt;p&gt;MiniMax M3 يبيع خطط رموز:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plus بسعر 20 دولارًا.&lt;/li&gt;
&lt;li&gt;Max بسعر 50 دولارًا.&lt;/li&gt;
&lt;li&gt;Ultra بسعر 120 دولارًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;تستخدم واجهة API سعرًا قياسيًا حتى 512 ألف رمز إدخال، وسعرًا منفصلًا للسياق الطويل فوق ذلك. لم تنشر MiniMax رقمًا دقيقًا لكل رمز هنا، لذلك لا يجب افتراض تكلفة غير موثقة.&lt;/p&gt;

&lt;p&gt;تفاصيل التوصيل موجودة في &lt;a href="https://apidog.com/ar/blog/how-to-use-minimax-m3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام واجهة برمجة تطبيقات MiniMax M3&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qwen 3.7
&lt;/h3&gt;

&lt;p&gt;Qwen 3.7 يُحاسب لكل رمز عبر Alibaba Cloud. بما أن أسعار المعاينة قد تتغير، تحقق من وثائق Alibaba Cloud الحالية قبل بناء تقدير تكلفة نهائي.&lt;/p&gt;

&lt;h2&gt;
  
  
  قرار الاختيار السريع
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;أولويتك&lt;/th&gt;
&lt;th&gt;الخيار الأنسب&lt;/th&gt;
&lt;th&gt;السبب&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;برمجة وكيلية مع معايير منشورة&lt;/td&gt;
&lt;td&gt;MiniMax M3&lt;/td&gt;
&lt;td&gt;أرقام SWE-Bench Pro وTerminal-Bench وMCP Atlas منشورة عند الإطلاق&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مدخلات صورة وفيديو واستخدام الكمبيوتر&lt;/td&gt;
&lt;td&gt;MiniMax M3&lt;/td&gt;
&lt;td&gt;الوحيد هنا بقدرة متعددة الوسائط أصلية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;أقل تكلفة API لحجم كبير&lt;/td&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;0.87 دولار تقريبًا لكل مليون رمز مخرج، مع Flash أرخص&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;إعادة هيكلة كود مع تبعيات متعددة&lt;/td&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;reasoning_content&lt;/code&gt; يساعد في تتبع التبعيات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;تشغيل وكلاء طويل المدى عبر API مستضاف&lt;/td&gt;
&lt;td&gt;Qwen3.7-Max أو MiniMax M3&lt;/td&gt;
&lt;td&gt;كلاهما يركز على مهام طويلة واستخدام أدوات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;استضافة ذاتية وتجنب الارتباط بمورد&lt;/td&gt;
&lt;td&gt;MiniMax M3 أو DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;كلاهما مرتبط بأوزان مفتوحة، بينما Qwen3.7-Max مغلق&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  اختبرها بنفسك بدل الاعتماد على الانطباع
&lt;/h2&gt;

&lt;p&gt;أفضل طريقة لاختيار نموذج برمجة هي تشغيل نفس الحالات عليه.&lt;/p&gt;

&lt;p&gt;جهّز مجموعة اختبارات صغيرة من واقع مشروعك:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;case-001: أصلح failing test في AuthService
case-002: أعد تسمية دالة عامة بدون كسر الواجهات
case-003: اشرح سبب بطء endpoint معيّن
case-004: اكتب migration آمن لجدول موجود
case-005: استدعِ أداة خارجية ثم لخّص النتيجة
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم اختبر كل نموذج بنفس الطلب.&lt;/p&gt;

&lt;p&gt;مثال طلب عام متوافق مع واجهات OpenAI-style APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MODEL_API_URL&lt;/span&gt;&lt;span class="s2"&gt;/chat/completions"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$MODEL_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MODEL_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;'",
    "messages": [
      {
        "role": "system",
        "content": "أنت مساعد برمجة. أجب بخطة قصيرة ثم diff قابل للتطبيق."
      },
      {
        "role": "user",
        "content": "أصلح الخطأ التالي في AuthService مع الحفاظ على الاختبارات الحالية..."
      }
    ],
    "temperature": 0.2
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قيّم النتيجة حسب معايير قابلة للقياس:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;هل الكود يمرر الاختبارات؟&lt;/li&gt;
&lt;li&gt;هل التعديل محدود أم يغيّر ملفات غير مطلوبة؟&lt;/li&gt;
&lt;li&gt;هل يشرح السبب بشكل صحيح؟&lt;/li&gt;
&lt;li&gt;هل يلتزم بشكل &lt;code&gt;tool_calls&lt;/code&gt;؟&lt;/li&gt;
&lt;li&gt;هل يرجع &lt;code&gt;reasoning_content&lt;/code&gt; أو مخرجات إضافية قد تحتاج معالجتها؟&lt;/li&gt;
&lt;li&gt;كم عدد رموز الإدخال والإخراج؟&lt;/li&gt;
&lt;li&gt;كم التكلفة لكل حالة؟&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  استخدام Apidog كمقعد مقارنة
&lt;/h2&gt;

&lt;p&gt;هذه مهمة مناسبة لـ &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;. أنشئ مشروعًا واحدًا وثلاث بيئات:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;minimax-m3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qwen-3.7-max&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ضع في كل بيئة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MODEL_API_URL
MODEL_API_KEY
MODEL_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم أنشئ طلب &lt;code&gt;POST /chat/completions&lt;/code&gt; واحدًا واستخدم المتغيرات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{MODEL_NAME}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"أنت مساعد برمجة. أعد diff فقط عندما يكون ذلك ممكنًا."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{PROMPT}}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد ذلك يمكنك:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تشغيل نفس الطلب على البيئات الثلاث.&lt;/li&gt;
&lt;li&gt;حفظ استجابات ذهبية لكل حالة.&lt;/li&gt;
&lt;li&gt;مقارنة المخرجات عند تغيير prompt النظام.&lt;/li&gt;
&lt;li&gt;التحقق من شكل &lt;code&gt;tool_calls&lt;/code&gt; و&lt;code&gt;reasoning_content&lt;/code&gt; عبر JSON Schema.&lt;/li&gt;
&lt;li&gt;قياس الانحراف قبل إدخال النموذج في وكيل إنتاجي.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;قم بتنزيل &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، ووجّه البيئات الثلاث إلى نقاط نهاية النماذج. تفاصيل إعداد MiniMax M3 موجودة في &lt;a href="https://apidog.com/ar/blog/how-to-use-minimax-m3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام واجهة برمجة تطبيقات MiniMax M3&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ما أفضل نموذج برمجة مفتوح الأوزان في 2026؟
&lt;/h3&gt;

&lt;p&gt;إذا كنت تريد أدلة برمجة وكيلية منشورة عند الإطلاق، MiniMax M3 هو الخيار الأوضح بسبب أرقام مثل SWE-Bench Pro بنسبة 59.0% وTerminal-Bench 2.1 بنسبة 66.0%، مع ملاحظة أنها أرقام مُبلغ عنها من المورد. DeepSeek V4-Pro هو خيار قوي إذا كانت التكلفة وجودة التفكير في الكود أهم. Qwen3.7-Max قوي، لكنه ليس مفتوح الأوزان بعد.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل الثلاثة مفتوحة الأوزان؟
&lt;/h3&gt;

&lt;p&gt;لا. MiniMax M3 مرتبط بنشر أوزان وتقرير تقني بعد الإطلاق. DeepSeek لديه سجل قوي في نشر أوزان مفتوحة عبر R1 وV3. Qwen3.7-Max-Preview مغلق الأوزان حتى الفترة المذكورة. التفاصيل في &lt;a href="https://apidog.com/ar/blog/what-is-qwen-3-7?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ما هو Qwen 3.7&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  أي نموذج يملك أكبر نافذة سياق؟
&lt;/h3&gt;

&lt;p&gt;MiniMax M3 وQwen3.7-Max يعلنان عن نافذة 1,000,000 رمز مميز. لم يُذكر رقم DeepSeek V4-Pro هنا. تذكّر أن النافذة الكبيرة لا تعني دائمًا استدعاء مثاليًا لكل التفاصيل، كما أنها تزيد التكلفة.&lt;/p&gt;

&lt;h3&gt;
  
  
  أيها الأقل تكلفة؟
&lt;/h3&gt;

&lt;p&gt;وفق التسعير المنشور هنا، DeepSeek V4-Pro هو الأرخص بوضوح: حوالي 0.87 دولار لكل مليون رمز مخرج، مع نسخة V4-Flash أرخص. MiniMax M3 يستخدم خططًا شهرية للرموز. Qwen 3.7 يُحاسب عبر Alibaba Cloud. راجع &lt;a href="https://apidog.com/ar/blog/chinese-llm-price-war-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;حرب أسعار LLM الصينية 2026&lt;/a&gt; للصورة العامة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل MiniMax M3 أفضل من DeepSeek V4-Pro في البرمجة؟
&lt;/h3&gt;

&lt;p&gt;لا توجد مقارنة مباشرة عادلة بكل المعايير حتى الآن. MiniMax M3 نشر أرقام SWE-Bench Pro وTerminal-Bench عند الإطلاق. DeepSeek V4-Pro يتميز بالسعر والتفكير عبر &lt;code&gt;reasoning_content&lt;/code&gt;. الاختبار الصحيح هو تشغيل نفس مهام مستودعك على النموذجين ومقارنة النتائج والتكلفة.&lt;/p&gt;

&lt;h2&gt;
  
  
  النسخة المختصرة
&lt;/h2&gt;

&lt;p&gt;اختر &lt;strong&gt;MiniMax M3&lt;/strong&gt; إذا كنت تريد برمجة وكيلية، سياق مليون رمز، وسائط متعددة، وأوزانًا مفتوحة عند توفرها.&lt;/p&gt;

&lt;p&gt;اختر &lt;strong&gt;DeepSeek V4-Pro&lt;/strong&gt; إذا كانت أولويتك أقل تكلفة API مع جودة كود قوية في مهام التفكير وإعادة الهيكلة.&lt;/p&gt;

&lt;p&gt;اختر &lt;strong&gt;Qwen3.7-Max&lt;/strong&gt; إذا كنت تريد نموذجًا قويًا للمهام الطويلة عبر API مستضاف ولا تحتاج إلى الاستضافة الذاتية الآن.&lt;/p&gt;

&lt;p&gt;لا تعتمد على لوحة متصدرين فقط. شغّل نفس المطالبات على النماذج الثلاثة داخل مشروع &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، راقب جودة المخرجات والفاتورة، ثم اختر النموذج الذي يفوز على عبء عملك الحقيقي.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
