پرش به مطلب اصلی

مبانی وب سرویس

همه وب سرویس‌های آریانت REST روی HTTPS هستند، JSON می‌گیرند و برمی‌گردانند و با توکن Bearer احراز هویت می‌شوند. این صفحه قواعد مشترک و تفاوت‌های هر محصول را یک‌جا نشان می‌دهد تا کلاینت شما برای همه درست کار کند.

آدرس‌ها و نسخه‌ها​

وب سرویسآدرس پایهسند OpenAPI
ابر آریانتhttps://api.ariaservice.net/cloud/v1openapi.json
سرور مجازی (VPS)https://api.ariaservice.net/api/v1openapi.yaml
VPS منطقه‌ایhttps://api.ariaservice.net/vps/v1openapi.json
هاستینگhttps://api.ariaservice.net/hosting/v1openapi.json
سرور اختصاصیhttps://api.ariaservice.net/baremetal/v1openapi.json
پیامکhttps://api.ariaservice.net/sms/v1openapi.json

نسخه در مسیر آمده است (v1). کلاینت را طوری بنویسید که فیلدهای ناشناخته پاسخ را نادیده بگیرد؛ فیلدها و مقدارهای تازه بدون تغییر نسخه اضافه می‌شوند.

درخواست و پاسخ​

  • بدنه درخواست‌های POST، PUT و PATCH JSON است و هدر Content-Type: application/json می‌خواهد.
  • زمان‌ها به UTC و در قالب ISO 8601 / RFC 3339 هستند (2026-10-02T09:30:00Z).
  • شناسه‌ها عدد صحیح هستند، مگر جایی که صفحه محصول خلافش را بگوید (مثلاً شماره فاکتور و شناسه پیامک متن هستند).
  • PATCH فقط فیلدهای ارسال‌شده را تغییر می‌دهد.

شکل پاسخ موفق در دو خانواده متفاوت است:

{ "data": { "id": 12, "name": "web-1" } }

خطاها​

هر خطا یک code ثابت و ماشین‌خوان دارد. منطق برنامه را بر اساس وضعیت HTTP و code بنویسید، نه متن پیام؛ پیام برای انسان است و ممکن است تغییر کند.

وب سرویسقالب خطا
ابر{"error": "...", "code": "not_found", "reason": "..."}؛ reason در صورت وجود حالت را دقیق‌تر می‌کند
VPS منطقه‌ای، هاستینگ، سرور اختصاصی{"error": "...", "code": "not_found"}
پیامک{"code": "not_found", "message": "..."}
VPS (/api/v1){"success": false, "error": {"code": "NOT_FOUND", "message": "..."}}

معنی وضعیت‌های HTTP در همه یکسان است:

HTTPمعنیتکرار؟
400 / 422ورودی نادرست، یا درخواست درست است اما الان قابل انجام نیستخیر؛ درخواست را اصلاح کنید
401توکن نیست یا نامعتبر استخیر
402موجودی کیف پول کافی نیستپس از شارژ
403دسترسی کافی نیستخیر
404منبع در حساب شما وجود نداردخیر
409 / 423وضعیت منبع الان اجازه نمی‌دهد یا منبع درگیر عملیات دیگری استبله، کمی بعد
429محدودیت نرخبله، پس از Retry-After
500 / 502 / 503خطای موقت سمت سروربله، با فاصله رو به افزایش
504پاسخ به‌موقع نرسید؛ ممکن است درخواست اجرا شده باشداول وضعیت را بخوانید

فهرست کامل codeهای هر وب سرویس در صفحه همان محصول و در سند OpenAPI آن آمده است.

محدودیت نرخ​

وب سرویسمحدودیت
ابر۶۰ درخواست در دقیقه و ۳۶۰۰ در ساعت برای هر حساب و کاربر
VPS (/api/v1)خواندن ۱۲۰ در دقیقه؛ نوشتن حدود ۲۰ در دقیقه؛ ساخت سرور ۵ در ساعت برای هر توکن (جزئیات)
VPS منطقه‌ای، هاستینگ، سرور اختصاصی، پیامکبرای هر فراخواننده؛ مقدار فعلی در هدرهای RateLimit-*

وب سرویس‌های جدید در هر پاسخ این هدرها را می‌فرستند:

هدرمعنی
RateLimit-Limitتعداد درخواست مجاز در پنجره فعلی
RateLimit-Remainingدرخواست‌های باقی‌مانده
RateLimit-Resetثانیه تا شروع پنجره بعدی

پس از عبور از حد، پاسخ 429 است و هدر Retry-After (بر حسب ثانیه) می‌گوید چقدر صبر کنید.

تکرار درخواست​

خطاهای 429، 502، 503 و خطای شبکه را با فاصله رو به افزایش (exponential backoff) تکرار کنید و Retry-After را اگر بود رعایت کنید. درخواست‌هایی را که پول خرج می‌کنند فقط با کلید ایدمپوتنسی تکرار کنید.

import os
import random
import time
import requests

RETRY = {429, 502, 503}

def call(method, url, **kwargs):
headers = {"Authorization": f"Bearer {os.environ['ARIANET_TOKEN']}", **kwargs.pop("headers", {})}
for attempt in range(6):
resp = requests.request(method, url, headers=headers, timeout=30, **kwargs)
if resp.status_code not in RETRY:
return resp
wait = float(resp.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait + random.random())
return resp

CLI خواندن‌هایی را که به محدودیت نرخ بخورند خودش تکرار می‌کند؛ تغییرات را هرگز خودکار تکرار نمی‌کند.

صفحه‌بندی​

وب سرویسپارامترهااطلاعات صفحه در پاسخ
ابرpage، per_page (۱ تا ۱۰۰، پیش‌فرض ۲۵)؛ بدون این دو، کل فهرست در یک صفحهmeta.pagination: page، per_page، previous_page، next_page، last_page
پیامکpage، per_page (حداکثر ۲۰۰)meta: total، current_page، per_page
VPS (/api/v1)page، limit (۱ تا ۱۰۰، پیش‌فرض ۱۵)pagination: current_page، per_page، total، last_page
VPS منطقه‌ای، هاستینگ، سرور اختصاصیفهرست‌ها کامل برمی‌گردند؛ فهرست actionها limit می‌گیرد-

عملیات ناهمگام​

کاری که زمان می‌برد (ساخت، حذف، نصب مجدد، تغییر پلن، روشن و خاموش کردن) بلافاصله پاسخ 201 یا 202 می‌دهد و در پس‌زمینه انجام می‌شود. پایان آن را این‌طور دنبال کنید:

وب سرویسچه چیزی را بررسی کنیدوضعیت نهایی
ابرGET /actions/{id} با action_id پاسخstatus: success یا error
VPS منطقه‌ای، هاستینگGET /actions/{id}state: success یا error
سرور اختصاصیGET /orders/{id} (مراحل تحویل)سفارش تحویل‌شده یا لغوشده
پیامکGET /batches/{id} یا وب‌هوکcompleted، partial یا failed
VPS (/api/v1)GET /servers/{id}/status یا GET /servers/{id}/actionsstatus برابر active / action با success یا failed

هر چند ثانیه یک بار بررسی کنید (مثلاً هر ۵ ثانیه) و برای کل انتظار سقف زمانی بگذارید. CLI با --wait و actions wait همین کار را انجام می‌دهد.

تکرار امن (ایدمپوتنسی)​

اگر پاسخ سفارشی به دست شما نرسد (قطع شبکه، 504)، نمی‌دانید سفارش ثبت شده یا نه. با کلید ایدمپوتنسی می‌توانید همان درخواست را بی‌خطر دوباره بفرستید: سفارش دوم ساخته نمی‌شود و پاسخ اول برمی‌گردد.

وب سرویسدرخواست‌هاچطور
VPS (/api/v1)POST /serversهدر Idempotency-Key اجباری (جزئیات)
VPS منطقه‌ایPOST /serversهدر Idempotency-Key
هاستینگPOST /accountsهدر Idempotency-Key
سرور اختصاصیPOST /orders، POST /servers/{id}/renewهدر Idempotency-Key
پیامکPOST /messagesفیلد client_reference (یا هدر Idempotency-Key)

برای هر سفارش تازه یک کلید تازه (مثلاً UUID) بسازید و تا گرفتن پاسخ قطعی همان را برای تکرارها نگه دارید.

curl -s -X POST https://api.ariaservice.net/vps/v1/servers \
-H "Authorization: Bearer $ARIANET_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"datacenter":"thr-1","plan_id":4,"image":"ubuntu-24.04","hostname":"web-1","billing_mode":"hourly"}'

ریجن‌ها​

VPS منطقه‌ای و هاستینگ در هر ریجن نصب جداگانه دارند. ریجن را با هدر Arianet-Region انتخاب کنید؛ بدون آن، درخواست به ریجن پیش‌فرض محصول می‌رود:

curl -s https://api.ariaservice.net/hosting/v1/accounts \
-H "Authorization: Bearer $ARIANET_TOKEN" \
-H "Arianet-Region: iran-1"

ریجن ناشناخته پاسخ 404 region_not_found می‌گیرد. پیامک فقط در iran-1 اجرا می‌شود و سرور اختصاصی یک نصب دارد؛ هیچ‌کدام به این هدر نیاز ندارند.

سقف زمان پاسخ و 504​

درخواست‌هایی که به ریجن دیگری می‌روند ممکن است با 504 gateway_timeout تمام شوند، در حالی که خود کار انجام شده باشد. پیش از تکرار، وضعیت را بخوانید (فهرست منابع یا actionها) یا از کلید ایدمپوتنسی استفاده کنید.