تخطَّ إلى المحتوى

Hoppscotch

نظام بيئي مفتوح المصدر لتطوير واجهات برمجة التطبيقات وبديل خفيف لـ Postman لاختبار واجهات REST و GraphQL و WebSocket والواجهات في الوقت الفعلي.

أمروصف
الانتقال إلى hoppscotch.ioفتح تطبيق Hoppscotch على الويب (بدون تثبيت)
التحميل من hoppscotch.io/downloadتثبيت تطبيق سطح المكتب (macOS, Windows, Linux)
تسجيل الدخول بـ GitHub أو Google أو البريد الإلكترونيإنشاء حساب لمزامنة الفريق
خيار تثبيت PWA في المتصفحالتثبيت كتطبيق ويب تقدمي

تثبيت واجهة سطر الأوامر

Section titled “تثبيت واجهة سطر الأوامر”
أمروصف
npm install -g @hoppscotch/cliتثبيت CLI عالمياً مع npm
npx @hoppscotch/cliتشغيل CLI بدون تثبيت
hopp --versionعرض إصدار CLI
hopp --helpعرض مساعدة CLI

التثبيت المستضاف ذاتياً

Section titled “التثبيت المستضاف ذاتياً”
أمروصف
docker pull hoppscotch/hoppscotchسحب صورة Docker
docker compose up -dبدء النسخة المستضافة ذاتياً

Docker Compose المستضاف ذاتياً

Section titled “Docker Compose المستضاف ذاتياً”
# docker-compose.yml للاستضافة الذاتية لـ Hoppscotch
version: "3"
services:
  hoppscotch:
    image: hoppscotch/hoppscotch:latest
    ports:
      - "3000:3000"   # Web UI
      - "3100:3100"   # Admin dashboard
      - "3170:3170"   # Backend API
    environment:
      DATABASE_URL: postgresql://user:pass@db:5432/hoppscotch
      JWT_SECRET: your-jwt-secret-here
      TOKEN_SALT_COMPLEXITY: 10
      MAGIC_LINK_TOKEN_VALIDITY: 3
      REFRESH_TOKEN_VALIDITY: 604800000
      ACCESS_TOKEN_VALIDITY: 86400000
      VITE_ALLOWED_AUTH_PROVIDERS: GITHUB,GOOGLE,EMAIL
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: hoppscotch

volumes:
  postgres_data:
أمروصف
اختيار الطريقة (GET, POST, PUT, DELETE, PATCH)اختيار طريقة HTTP من القائمة المنسدلة
إدخال URL في شريط العنوانتعيين نقطة نهاية الطلب
النقر على “Send”تنفيذ الطلب
Ctrl + Enterإرسال الطلب (اختصار لوحة المفاتيح)
Ctrl + Gإرسال وتحميل الاستجابة
Ctrl + Kفتح لوحة الأوامر
أمروصف
النقر على تبويب “Body” → اختيار النوعتعيين تنسيق جسم الطلب
اختيار “application/json”جسم JSON (الأكثر شيوعاً)
اختيار “multipart/form-data”رفع الملفات
اختيار “application/x-www-form-urlencoded”بيانات النموذج
اختيار “text/plain”جسم نص عادي
اختيار “application/xml”جسم XML
اختيار “Binary”بيانات ثنائية خام
أمروصف
النقر على تبويب “Headers” → إضافة ترويسةإضافة ترويسات طلب مخصصة
النقر على تبويب “Parameters”إضافة معاملات استعلام URL
وضع التحرير الجماعي للترويساتلصق عدة ترويسات دفعة واحدة
تبديل الترويسة نشطة/غير نشطةالتعطيل بدون الحذف
استخدام <<variable>> في القيمالإشارة إلى متغيرات البيئة
أمروصف
عرض جسم الاستجابةJSON, HTML, XML, ثنائي, صورة
النقر على تبويب “Headers” في الاستجابةفحص ترويسات الاستجابة
عرض رمز الحالة والوقتحالة HTTP, زمن الاستجابة, الحجم
النقر على “Copy” في الاستجابةنسخ الاستجابة إلى الحافظة
النقر على “Download”تحميل الاستجابة كملف
الاستجابة JSON مُنسقة تلقائياًعرض شجري قابل للطي
النقر على “Timeline”عرض الجدول الزمني للطلب/الاستجابة
Method:  POST
URL:     https://api.example.com/users
Headers:
  Content-Type: application/json
  Authorization: Bearer <<auth_token>>

Body (JSON):
{
  "name": "Alice Smith",
  "email": "alice@example.com",
  "role": "admin"
}

Response: 201 Created (145ms, 234 B)
{
  "id": 42,
  "name": "Alice Smith",
  "email": "alice@example.com",
  "role": "admin",
  "created_at": "2024-01-15T10:30:00Z"
}
أمروصف
النقر على ”+” في لوحة المجموعاتإنشاء مجموعة جديدة
النقر بالزر الأيمن على المجموعة → “New Request”إضافة طلب إلى المجموعة
النقر بالزر الأيمن على المجموعة → “New Folder”التنظيم بمجلدات فرعية
سحب الطلبات بين المجلداتإعادة ترتيب عناصر المجموعة
النقر بالزر الأيمن → “Duplicate”استنساخ مجموعة
النقر بالزر الأيمن → “Properties”تحرير إعدادات المجموعة
النقر بالزر الأيمن → “Delete”حذف المجموعة
Ctrl + Shift + Pالبحث داخل المجموعات
أمروصف
النقر على “Import” → اختيار ملفاستيراد مجموعة
النقر بالزر الأيمن → “Export”تصدير المجموعة كـ JSON
الاستيراد من Postman Collection v2التوافق مع Postman
الاستيراد من مواصفات OpenAPI/Swaggerإنشاء الطلبات تلقائياً
الاستيراد من Insomniaالتوافق مع Insomnia
الاستيراد من cURLلصق أمر cURL
الاستيراد من HARاستيراد أرشيف HTTP
Supported import formats:
  - Hoppscotch Collection (native JSON)
  - Postman Collection v2
  - OpenAPI 3.0 / Swagger 2.0
  - Insomnia v4
  - cURL commands
  - HAR (HTTP Archive)

Import from cURL:
  Paste a cURL command directly into the URL bar
  Hoppscotch auto-parses method, headers, body, and URL
أمروصف
النقر على “Environments” في الشريط الجانبيفتح مدير البيئات
النقر على ”+” لإنشاء بيئةإنشاء بيئة جديدة
إضافة أزواج key: valueتعريف المتغيرات
استخدام <<variable_name>> في الطلباتالإشارة إلى المتغير في أي حقل
اختيار البيئة من القائمة المنسدلةتنشيط بيئة
النقر على تبويب “Global”تعيين متغيرات عامة (نشطة دائماً)
النقر بالزر الأيمن → “Export”تصدير البيئة كـ JSON
النقر بالزر الأيمن → “Duplicate”استنساخ البيئة
النوعوصف
متغير عاديمرئي في الواجهة, يُصدَّر في المجموعات
متغير سريمخفي في الواجهة, لا يُصدَّر
متغير عاممتاح في جميع البيئات
متغير بيئةمتاح فقط عندما تكون البيئة نشطة
Environment: "Production"
┌───────────────┬──────────────────────────────┬──────────┐
│ Key           │ Value                        │ Type     │
├───────────────┼──────────────────────────────┼──────────┤
│ base_url      │ https://api.example.com      │ Regular  │
│ api_version   │ v2                           │ Regular  │
│ auth_token    │ eyJhbGciOiJIUzI1NiIsIn...    │ Secret   │
│ timeout       │ 30000                        │ Regular  │
└───────────────┴──────────────────────────────┴──────────┘

Usage in requests:
  URL:    <<base_url>>/<<api_version>>/users
  Header: Authorization: Bearer <<auth_token>>
أمروصف
اختيار “Bearer Token”إضافة مصادقة Bearer token
اختيار “Basic Auth”مصادقة اسم المستخدم/كلمة المرور
اختيار “OAuth 2.0”تكوين تدفق OAuth 2.0
اختيار “API Key”إضافة مفتاح API إلى الترويسة أو معامل الاستعلام
اختيار “AWS Signature”مصادقة AWS Signature V4
اختيار “Inherit from parent”وراثة المصادقة من المجموعة
اختيار “None”إزالة المصادقة
حقول الرمز تدعم <<variables>>استخدام متغيرات البيئة في رموز المصادقة
OAuth 2.0 Configuration:
  Grant Type:       Authorization Code
  Auth URL:         https://auth.example.com/authorize
  Token URL:        https://auth.example.com/token
  Client ID:        <<client_id>>
  Client Secret:    <<client_secret>>
  Scope:            read write
  Redirect URI:     Auto-configured

Supported grant types:
  - Authorization Code (+ PKCE)
  - Client Credentials
  - Implicit
  - Password Credentials

الاختبار في الوقت الفعلي

Section titled “الاختبار في الوقت الفعلي”
أمروصف
النقر على “Realtime” → “WebSocket”فتح عميل WebSocket
إدخال عنوان wss://تعيين نقطة نهاية WebSocket
النقر على “Connect”إنشاء الاتصال
كتابة رسالة → النقر على “Send”إرسال رسالة إلى الخادم
عرض الرسائل في لوحة السجلمراقبة الوارد/الصادر
النقر على “Disconnect”إغلاق الاتصال
إضافة بروتوكولات/ترويساتتكوين معاملات الاتصال

أحداث الخادم المُرسلة (SSE)

Section titled “أحداث الخادم المُرسلة (SSE)”
أمروصف
النقر على “Realtime” → “SSE”اختبار Server-Sent Events
إدخال عنوان URL لنقطة نهاية SSEتعيين عنوان تدفق الأحداث
النقر على “Connect”بدء استقبال الأحداث
تسجيل الأحداث في الوقت الفعليمراقبة تدفق الأحداث
النقر على “Disconnect”إيقاف الاستقبال
أمروصف
النقر على “Realtime” → “MQTT”اختبار اتصالات MQTT
إدخال عنوان mqtt:// أو wss://تعيين عنوان وسيط MQTT
تعيين Client ID واسم المستخدم وكلمة المرورتكوين بيانات الاعتماد
الاشتراك في المواضيعالاستماع للرسائل
النشر في المواضيعإرسال الرسائل
أمروصف
النقر على “Realtime” → “Socket.IO”اختبار اتصالات Socket.IO
إدخال عنوان الخادمتعيين نقطة نهاية Socket.IO
الاستماع للأحداثالاشتراك في أحداث مسماة
إرسال أحداث مع بياناتإرسال أحداث مسماة
عرض حالة الاتصالمراقبة الاتصال/قطع الاتصال
أمروصف
النقر على تبويب “GraphQL”التبديل إلى وضع GraphQL
إدخال عنوان نقطة نهاية GraphQLتعيين عنوان خادم GraphQL
كتابة الاستعلام في لوحة المحررتأليف استعلام GraphQL
النقر على “Schema” لجلب المخططتحميل مخطط الخادم للإكمال التلقائي
إضافة متغيرات في لوحة Variablesتعيين متغيرات الاستعلام كـ JSON
إضافة ترويسات للمصادقةتعيين ترويسات المصادقة
النقر على “Run” أو Ctrl + Enterتنفيذ الاستعلام
استخدام الإكمال التلقائي من المخططالحصول على اقتراحات الحقول
Endpoint: https://api.example.com/graphql

Query:
  query GetUsers($limit: Int!) {
    users(limit: $limit) {
      id
      name
      email
      posts {
        title
        createdAt
      }
    }
  }

Variables:
  {
    "limit": 10
  }

Headers:
  Authorization: Bearer <<auth_token>>

استخدام واجهة سطر الأوامر

Section titled “استخدام واجهة سطر الأوامر”
أمروصف
hopp test collection.jsonتشغيل اختبارات المجموعة
hopp test collection.json -e environment.jsonالتشغيل مع بيئة
hopp test collection.json --delay 500التأخير بين الطلبات (مللي ثانية)
hopp test collection.json --reporter junitإخراج تقرير اختبار JUnit
hopp test collection.json --reporter jsonإخراج تقرير اختبار JSON
hopp test collection.json --bailالتوقف عند أول فشل
hopp test collection.json --env-var KEY=VALUEتجاوز متغير البيئة
# Run collection with environment
hopp test api-tests.json -e production.json

# Run with delay and stop on failure
hopp test api-tests.json --delay 1000 --bail

# Generate JUnit report for CI/CD
hopp test api-tests.json --reporter junit > results.xml

# Override specific variables
hopp test api-tests.json \
  --env-var "base_url=https://staging.example.com" \
  --env-var "auth_token=test-token-123"

# CI/CD pipeline example
hopp test api-tests.json -e staging.json --bail --reporter junit

نصوص ما قبل الطلب وما بعد الطلب

Section titled “نصوص ما قبل الطلب وما بعد الطلب”
أمروصف
النقر على تبويب “Pre-request”إضافة نص يُنفذ قبل الطلب
النقر على تبويب “Tests”إضافة نص يُنفذ بعد الاستجابة
pw.env.set("key", "value")تعيين متغير بيئة
pw.env.get("key")الحصول على متغير بيئة
pw.expect(response.status).toBe(200)التحقق من رمز الحالة
pw.expect(response.body).toHaveProperty("id")التحقق من خاصية الجسم
// Pre-request: Generate timestamp
pw.env.set("timestamp", Date.now().toString());

// Pre-request: Generate random ID
pw.env.set("random_id", Math.random().toString(36).slice(2));

// Test: Check status code
pw.test("Status is 200", () => {
  pw.expect(pw.response.status).toBe(200);
});

// Test: Check response body
pw.test("Response has user data", () => {
  const body = pw.response.body;
  pw.expect(body).toHaveProperty("id");
  pw.expect(body).toHaveProperty("name");
  pw.expect(body.name).toBe("Alice");
});

// Test: Check response time
pw.test("Response is fast", () => {
  pw.expect(pw.response.status).toBeLessThan(500);
});

// Test: Save token for next request
pw.test("Extract auth token", () => {
  const token = pw.response.body.access_token;
  pw.env.set("auth_token", token);
});

اختصارات لوحة المفاتيح

Section titled “اختصارات لوحة المفاتيح”
اختصاروصف
Ctrl + Enterإرسال الطلب
Ctrl + Kلوحة الأوامر
Ctrl + Sحفظ الطلب الحالي
Ctrl + Shift + Pالبحث في المجموعات
Ctrl + /تبديل الشريط الجانبي
Alt + ↑الطلب السابق في السجل
Alt + ↓الطلب التالي في السجل
F11تبديل ملء الشاشة
أمروصف
إنشاء فريق من الشريط الجانبيإعداد مساحة عمل الفريق
دعوة الأعضاء بالبريد الإلكترونيإضافة المتعاونين
المجموعات المشتركةمكتبات طلبات على مستوى الفريق
البيئات المشتركةمجموعات متغيرات على مستوى الفريق
التعاون في الوقت الفعليرؤية تعديلات الفريق مباشرة
التحكم في الوصول القائم على الأدوارأدوار المالك والمحرر والمشاهد
  1. تنظيم المجموعات حسب مجال API — قم بتجميع نقاط النهاية المرتبطة في مجموعات واستخدم المجلدات لأنواع الموارد (users, orders, products) للحفاظ على سهولة البحث.

  2. استخدام البيئات للتجهيز مقابل الإنتاج — أنشئ بيئات منفصلة للتطوير والتجهيز والإنتاج بنفس أسماء المتغيرات ولكن بقيم مختلفة. التبديل بنقرة واحدة.

  3. تخزين الأسرار كمتغيرات سرية — قم بتعليم مفاتيح API والرموز كنوع “secret” بحيث تكون مخفية في الواجهة ومستبعدة من التصدير.

  4. استخدام نصوص ما قبل الطلب للمصادقة — قم بإنشاء الطوابع الزمنية وحساب التوقيعات أو تحديث الرموز تلقائياً قبل كل طلب بدلاً من نسخها يدوياً.

  5. كتابة اختبارات لنقاط النهاية الحرجة — أضف نصوص اختبار للتحقق من رموز الحالة وبنية الاستجابة والقيم الرئيسية. شغّلها عبر CLI في خطوط أنابيب CI/CD.

  6. الاستيراد من مواصفات OpenAPI — عند العمل مع واجهات موثقة, استورد مواصفات OpenAPI/Swagger لإنشاء جميع نقاط النهاية تلقائياً مع المعاملات الصحيحة.

  7. استخدام المصادقة على مستوى المجموعة — قم بتعيين المصادقة على مستوى المجموعة واستخدم “Inherit from parent” في الطلبات الفردية لتجنب تكرار تكوين المصادقة.

  8. تصدير المجموعات إلى التحكم في الإصدار — صدّر المجموعات كـ JSON وأضفها إلى المستودع للتحكم في الإصدار والمشاركة مع الفريق.

  9. استخدام CLI في CI/CD — أضف hopp test إلى خط الأنابيب لتشغيل اختبارات API في كل نشر, مما يضمن عمل نقاط النهاية قبل الإطلاق.

  10. الاستضافة الذاتية للواجهات الحساسة — إذا كنت تختبر واجهات داخلية أو حساسة, انشر نسخة Docker المستضافة ذاتياً للحفاظ على جميع البيانات داخل بنيتك التحتية.