NueForm

معالجة الأخطاء

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

تستخدم واجهة برمجة تطبيقات NueForm رموز حالة HTTP التقليدية وتُرجع استجابات أخطاء JSON منظمة. يغطي هذا الدليل تنسيق الاستجابة وجميع رموز الأخطاء الممكنة وأنماط معالجة الأخطاء في الكود الخاص بك.

تنسيقات الاستجابة

استجابات النجاح

تُرجع استدعاءات API الناجحة كائن JSON يحتوي على حقل data. تتضمن نقاط النهاية التي تُرجع قوائم أيضًا حقل meta مع معلومات التصفح.

json
{
  "data": {
    "id": "clx1abc2d3e4f5g6h7i8j9k0",
    "title": "Customer Feedback",
    "status": "published",
    "created_at": "2026-01-15T09:30:00.000Z"
  }
}

مع بيانات التصفح الوصفية:

json
{
  "data": [
    {
      "id": "clx1abc2d3e4f5g6h7i8j9k0",
      "title": "Customer Feedback"
    },
    {
      "id": "clx2def3g4h5i6j7k8l9m0n1",
      "title": "Employee Survey"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 150,
    "total_pages": 8
  }
}

استجابات الخطأ

تُرجع استجابات الخطأ كائن JSON يحتوي على حقل error يتضمن رمز الخطأ code ورسالة مقروءة message ورمز حالة HTTP status.

json
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested form could not be found.",
    "status": 404
  }
}

رموز الأخطاء

يسرد الجدول التالي جميع رموز الأخطاء التي تُرجعها الواجهة البرمجية:

الرمزحالة HTTPالوصف
BAD_REQUEST400الطلب غير صحيح التنسيق، أو يفتقد حقولاً مطلوبة، أو يحتوي على قيم غير صالحة.
UNAUTHORIZED401فشلت المصادقة. مفتاح API مفقود أو غير صحيح التنسيق أو ملغى أو منتهي الصلاحية.
FORBIDDEN403المستخدم المُصادق عليه ليس لديه إذن لتنفيذ هذا الإجراء.
NOT_FOUND404المورد المطلوب غير موجود أو غير متاح للمستخدم المُصادق عليه.
CONFLICT409الطلب يتعارض مع الحالة الحالية للمورد (مثل إدخال مكرر).
RATE_LIMITED429طلبات كثيرة جدًا. راجع حدود الطلبات للتفاصيل.
INTERNAL_ERROR500حدث خطأ غير متوقع في الخادم.

أمثلة على استجابات الأخطاء

400 Bad Request

يُرجع عندما يكون نص الطلب غير صالح أو الحقول المطلوبة مفقودة.

json
{
  "error": {
    "code": "BAD_REQUEST",
    "message": "Field 'title' is required.",
    "status": 400
  }
}

401 Unauthorized

يُرجع عند فشل المصادقة لأي سبب.

json
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or expired API key.",
    "status": 401
  }
}

403 Forbidden

يُرجع عندما يكون المستخدم مُصادقًا عليه لكنه يفتقر إلى الإذن. تشمل الأسباب الشائعة الوصول إلى موارد مستخدم آخر أو استخدام ميزة غير متاحة في الخطة الحالية.

json
{
  "error": {
    "code": "FORBIDDEN",
    "message": "API access is not available on your current plan.",
    "status": 403
  }
}

404 Not Found

يُرجع عندما لا يكون المورد المطلوب موجودًا.

json
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested form could not be found.",
    "status": 404
  }
}

409 Conflict

يُرجع عندما يؤدي الطلب إلى إنشاء نسخة مكررة أو يتعارض مع بيانات موجودة.

json
{
  "error": {
    "code": "CONFLICT",
    "message": "A form with this slug already exists.",
    "status": 409
  }
}

429 Rate Limited

يُرجع عند تجاوز حد الطلبات. يتضمن ترويسة Retry-After.

json
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Please try again later.",
    "status": 429
  }
}

500 Internal Error

يُرجع عند حدوث خطأ غير متوقع في الخادم. إذا استمر هذا، تواصل مع الدعم.

json
{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "An internal error occurred.",
    "status": 500
  }
}

معالجة الأخطاء في الكود

JavaScript

أنشئ عميل API قابل لإعادة الاستخدام يتحقق من الأخطاء ويطرح استثناءات مُصنّفة:

javascript
class NueFormApiError extends Error {
  constructor(code, message, status) {
    super(message);
    this.name = "NueFormApiError";
    this.code = code;
    this.status = status;
  }
}

async function nueformRequest(path, options = {}) {
  const response = await fetch(`https://app.nueform.com/api/v1${path}`, {
    ...options,
    headers: {
      "Authorization": `Bearer ${process.env.NUEFORM_API_KEY}`,
      "Content-Type": "application/json",
      ...options.headers,
    },
  });

  const body = await response.json();

  if (!response.ok) {
    const { code, message, status } = body.error;
    throw new NueFormApiError(code, message, status);
  }

  return body;
}

// Usage
async function getForm(formId) {
  try {
    const { data } = await nueformRequest(`/forms/${formId}`);
    return data;
  } catch (error) {
    if (error instanceof NueFormApiError) {
      switch (error.code) {
        case "NOT_FOUND":
          console.error(`Form ${formId} does not exist.`);
          return null;
        case "UNAUTHORIZED":
          console.error("Check your API key configuration.");
          break;
        case "RATE_LIMITED":
          console.warn("Rate limited. Implement backoff and retry.");
          break;
        default:
          console.error(`API error [${error.code}]: ${error.message}`);
      }
    }
    throw error;
  }
}

Python

python
import os
import requests

class NueFormApiError(Exception):
    def __init__(self, code, message, status):
        super().__init__(message)
        self.code = code
        self.status = status

class NueFormClient:
    def __init__(self, api_key=None):
        self.api_key = api_key or os.environ["NUEFORM_API_KEY"]
        self.base_url = "https://app.nueform.com/api/v1"

    def request(self, method, path, **kwargs):
        url = f"{self.base_url}{path}"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
        }

        response = requests.request(method, url, headers=headers, **kwargs)
        body = response.json()

        if not response.ok:
            error = body["error"]
            raise NueFormApiError(
                error["code"], error["message"], error["status"]
            )

        return body

# Usage
client = NueFormClient()

try:
    result = client.request("GET", f"/forms/{form_id}")
    form = result["data"]
    print(f"Form: {form['title']}")

except NueFormApiError as e:
    if e.code == "NOT_FOUND":
        print(f"Form {form_id} does not exist.")
    elif e.code == "UNAUTHORIZED":
        print("Check your API key configuration.")
    elif e.code == "RATE_LIMITED":
        print("Rate limited. Implement backoff and retry.")
    else:
        print(f"API error [{e.code}]: {e}")

أفضل الممارسات

تحقق دائمًا من حقل error

لا تفترض أبدًا أن الاستجابة ناجحة بناءً على وجود نص فقط. تحقق دائمًا من حقل error أو تحقق من رمز حالة HTTP قبل معالجة الاستجابة.

استخدم رموز أخطاء محددة للتحكم في التدفق

طابق رمز error.code (مثل NOT_FOUND أو RATE_LIMITED) بدلاً من رمز حالة HTTP. رموز الأخطاء مستقرة ووصفية وأسهل في الاستخدام ضمن منطق التطبيق.

سجّل تفاصيل الأخطاء

ضمّن استجابة الخطأ الكاملة في سجلاتك لأغراض التصحيح. يوفر code وmessage وstatus معًا سياقًا كافيًا لتشخيص معظم المشكلات دون إعادة إنتاج الطلب.

عالج أخطاء 5xx بإعادة المحاولة

أخطاء الخادم (500 Internal Error) عادة ما تكون مؤقتة. نفّذ منطق إعادة المحاولة مع التراجع الأسّي لهذه الاستجابات. حدّد إعادة المحاولة بـ 2-3 محاولات قبل الفشل.

لا تعرض رسائل الخطأ للمستخدمين النهائيين

رسائل خطأ API مصممة للمطورين وليس للمستخدمين النهائيين. حوّل أخطاء API إلى رسائل سهلة الفهم في تطبيقك.

إذا تلقيت استجابات 500 Internal Error مستمرة، يرجى التواصل مع الدعم مع تفاصيل الطلب والطوابع الزمنية. يتم تسجيل أخطاء الخادم من جانبنا والتحقيق فيها.

آخر تحديث: 6 أبريل 2026