تستخدم واجهة برمجة تطبيقات NueForm رموز حالة HTTP التقليدية وتُرجع استجابات أخطاء JSON منظمة. يغطي هذا الدليل تنسيق الاستجابة وجميع رموز الأخطاء الممكنة وأنماط معالجة الأخطاء في الكود الخاص بك.
تنسيقات الاستجابة
استجابات النجاح
تُرجع استدعاءات API الناجحة كائن JSON يحتوي على حقل data. تتضمن نقاط النهاية التي تُرجع قوائم أيضًا حقل meta مع معلومات التصفح.
{
"data": {
"id": "clx1abc2d3e4f5g6h7i8j9k0",
"title": "Customer Feedback",
"status": "published",
"created_at": "2026-01-15T09:30:00.000Z"
}
}
مع بيانات التصفح الوصفية:
{
"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.
{
"error": {
"code": "NOT_FOUND",
"message": "The requested form could not be found.",
"status": 404
}
}
رموز الأخطاء
يسرد الجدول التالي جميع رموز الأخطاء التي تُرجعها الواجهة البرمجية:
| الرمز | حالة HTTP | الوصف |
|---|---|---|
BAD_REQUEST | 400 | الطلب غير صحيح التنسيق، أو يفتقد حقولاً مطلوبة، أو يحتوي على قيم غير صالحة. |
UNAUTHORIZED | 401 | فشلت المصادقة. مفتاح API مفقود أو غير صحيح التنسيق أو ملغى أو منتهي الصلاحية. |
FORBIDDEN | 403 | المستخدم المُصادق عليه ليس لديه إذن لتنفيذ هذا الإجراء. |
NOT_FOUND | 404 | المورد المطلوب غير موجود أو غير متاح للمستخدم المُصادق عليه. |
CONFLICT | 409 | الطلب يتعارض مع الحالة الحالية للمورد (مثل إدخال مكرر). |
RATE_LIMITED | 429 | طلبات كثيرة جدًا. راجع حدود الطلبات للتفاصيل. |
INTERNAL_ERROR | 500 | حدث خطأ غير متوقع في الخادم. |
أمثلة على استجابات الأخطاء
400 Bad Request
يُرجع عندما يكون نص الطلب غير صالح أو الحقول المطلوبة مفقودة.
{
"error": {
"code": "BAD_REQUEST",
"message": "Field 'title' is required.",
"status": 400
}
}
401 Unauthorized
يُرجع عند فشل المصادقة لأي سبب.
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired API key.",
"status": 401
}
}
403 Forbidden
يُرجع عندما يكون المستخدم مُصادقًا عليه لكنه يفتقر إلى الإذن. تشمل الأسباب الشائعة الوصول إلى موارد مستخدم آخر أو استخدام ميزة غير متاحة في الخطة الحالية.
{
"error": {
"code": "FORBIDDEN",
"message": "API access is not available on your current plan.",
"status": 403
}
}
404 Not Found
يُرجع عندما لا يكون المورد المطلوب موجودًا.
{
"error": {
"code": "NOT_FOUND",
"message": "The requested form could not be found.",
"status": 404
}
}
409 Conflict
يُرجع عندما يؤدي الطلب إلى إنشاء نسخة مكررة أو يتعارض مع بيانات موجودة.
{
"error": {
"code": "CONFLICT",
"message": "A form with this slug already exists.",
"status": 409
}
}
429 Rate Limited
يُرجع عند تجاوز حد الطلبات. يتضمن ترويسة Retry-After.
{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Please try again later.",
"status": 429
}
}
500 Internal Error
يُرجع عند حدوث خطأ غير متوقع في الخادم. إذا استمر هذا، تواصل مع الدعم.
{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred.",
"status": 500
}
}
معالجة الأخطاء في الكود
JavaScript
أنشئ عميل API قابل لإعادة الاستخدام يتحقق من الأخطاء ويطرح استثناءات مُصنّفة:
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
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 مستمرة، يرجى التواصل مع الدعم مع تفاصيل الطلب والطوابع الزمنية. يتم تسجيل أخطاء الخادم من جانبنا والتحقيق فيها.