Skip to main content
مستندات
مرکز آموزش

مدیریت محتوا را با راهنماهای جامع، آموزش‌ها و مستندات API به‌خوبی یاد بگیرید

لینک‌های سریع

خطاها و کدهای پاسخ

API Discuse مشکلات را به دو روش اعلام می‌کند: یا با یک وضعیت خطای HTTP همراه با یک message، یا با یک پاسخ عادی 200 که فیلدهای آن نشان می‌دهند چه اتفاقی افتاده است. این صفحه همهٔ حالت‌ها را فهرست می‌کند تا بتوانید آن‌ها را درست مدیریت کنید — و موردی را توضیح می‌دهد که خیلی‌ها را به اشتباه می‌اندازد: تمام‌شدن سهمیهٔ صورتحساب خطای HTTP نیست.

API چه وضعیت‌های HTTP برمی‌گرداند؟

Status When What to do
200 موفقیت — از جمله حالت «تمام‌شدن سهمیه» بدنهٔ پاسخ را بررسی کنید؛ 200 همیشه به معنی مجوز عبور نیست (پایین‌تر را ببینید)
400 اعتبارسنجی درخواست ناموفق بوده — محتوای خالی، text با بیش از ۱۰٬۰۰۰ نویسه، یا تعداد بیش از حد URL رسانه درخواست را اصلاح کنید؛ بدون تغییر دوباره تلاش نکنید
401 کلید API وجود ندارد یا نامعتبر است هدر X-API-Key را بررسی کنید؛ بدون تغییر دوباره تلاش نکنید
429 محدودیت نرخ برای این کلید رد شده است کمی صبر کنید و پس از پنجرهٔ یک‌دقیقه‌ای دوباره تلاش کنید
500 خطای داخلی یا خطا در سرویس پایین‌دستی با وقفهٔ افزایشی دوباره تلاش کنید

در هر پاسخ غیر 2xx مقدار message را بخوانید. خطاهای احراز هویت 401، خطاهای محدودیت نرخ 429 و خطاهای اعتبارسنجی درخواست 400 برمی‌گردانند؛ 5xx را موقتی در نظر بگیرید و با وقفهٔ افزایشی دوباره تلاش کنید.

چرا «تمام‌شدن سهمیه» 200 است و خطا نیست؟

وقتی یک پروژه سهمیهٔ ماهانهٔ درخواست‌های API خود را مصرف می‌کند، POST /api/v2/check همچنان 200 برمی‌گرداند — در حالی که محتوا بدون تخلف در نظر گرفته می‌شود، یک message توضیح می‌دهد که سهمیه تمام شده، و یک شیء usage نشان می‌دهد چیزی باقی نمانده است:

{
  "has_violations": false,
  "message": "API quota exceeded. Current: 10000, Limit: 10000",
  "usage": {
    "api_requests_used": 10000,
    "api_requests_limit": 10000,
    "api_requests_remaining": 0
  }
}

این رفتار عمدی است: تمام‌شدن سهمیه نباید شبیه خرابی سرور به نظر برسد یا با یک exception مسیر پردازش شما را متوقف کند. به‌جای تکیه بر کد وضعیت، usage.api_requests_remainingmessage) را بررسی کنید. اگر روی یک 200 به‌صورت پیش‌فرض اجازهٔ عبور بدهید، تمام‌شدن سهمیه باعث می‌شود محتوا بی‌سروصدا و بدون بررسی عبور کند — پس صریحاً بر اساس این فیلدها شاخه‌بندی کنید.

یک پاسخ موفق را چطور باید بخوانم؟

یک 200 از /api/v2/check همیشه شامل has_violations و cached است؛ بقیهٔ موارد اختیاری‌اند:

Field Type Meaning
has_violations boolean اگر هرکدام از بررسی‌های فعال، محتوا را علامت‌گذاری کرده باشد، True است
cached boolean اگر پاسخ از کش یک درخواست یکسان و اخیر ارائه شده باشد، True است
message string هنگام تمام‌شدن سهمیه (و اعلان‌های غیرخطای مشابه) وجود دارد
request_id string اگر آن را فرستاده باشید، همان مقدار بازگردانده می‌شود
processing_time_ms number وقتی زمان‌سنجی برای پروژه فعال باشد وجود دارد
usage object api_requests_used, api_requests_limit, api_requests_remaining
results object جزئیات به تفکیک هر بررسی (spamfinder, sentiment, images, …) و پرچم سطح بالای hits

برای نتیجهٔ کلی بر اساس has_violations تصمیم بگیرید، سپس برای اینکه ببینید کدام بررسی فعال شده است، وارد results.<check>.hit شوید.

کش‌کردن چه اثری روی پاسخ‌ها دارد؟

درخواست‌های یکسان برای یک پروژهٔ یکسان یکپارچه‌سازی می‌شوند: تکرار درخواست، همان نتیجه را با cached: true برمی‌گرداند. کش برای هر پروژه جداگانه است. توجه داشته باشید که یک درخواست کش‌شده همچنان در سهمیهٔ درخواست‌های API شما حساب می‌شود — کش زمان پردازش را کاهش می‌دهد، نه سهمیه را.

می‌توانید برای همبستگی داخلی خودتان یک request_id به درخواست اضافه کنید؛ همان مقدار در پاسخ بازگردانده می‌شود.

یک کلاینت حداقلی و درست

async function check(content, settings) {
  const response = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({ content, settings })
  });

  // 400: bad request — fix it, don't retry. 5xx: transient/auth/rate-limit — retry with backoff.
  if (response.status === 400) {
    throw new Error('Invalid request: ' + (await response.text()));
  }
  if (!response.ok) {
    throw new Error(`Discuse error ${response.status}`); // retry upstream with backoff
  }

  const data = await response.json();

  // Quota exhausted is a 200 — never treat it as "checked and clean".
  if (data.usage && data.usage.api_requests_remaining === 0 && data.message) {
    throw new Error('Quota exhausted: ' + data.message);
  }

  return data; // inspect data.has_violations and data.results
}

مرتبط

نوشته تیم Discuse · آخرین به‌روزرسانی June 2026

مقاله‌های مرتبط

مدیریت محتوا چیست؟

درک مبانی مدیریت محتوا و اینکه چرا برای پلتفرم شما اهمیت دارد

راهنمای شروع سریع

در کمتر از 5 دقیقه با Discuse API راه‌اندازی و شروع به کار کنید

احراز هویت و کلیدهای API

نحوه احراز هویت درخواست‌ها و مدیریت امن کلیدهای API شما