Yanıt Formatları

API Yanıt Yapılarını Anlama

mindzieAPI yanıt formatları, durum kodları, hata yönetimi desenleri ve veri yapıları hakkında bilgi edinerek sağlam entegrasyonlar oluşturun.

Standart Yanıt Formatı

Tüm mindzieAPI yanıtları, öngörülebilir yapılarla tutarlı JSON formatlamayı takip eder:

Başarılı Yanıt

{
  "data": {
    // Birincil yanıt verisi
  },
  "metadata": {
    "timestamp": "2024-01-15T10:30:00Z",
    "requestId": "req_12345",
    "version": "1.0.0"
  },
  "pagination": {
    // Sayfalandırılmış yanıtlar için mevcut
    "currentPage": 1,
    "totalPages": 5,
    "totalItems": 100,
    "itemsPerPage": 20,
    "hasNext": true,
    "hasPrevious": false
  }
}

Hata Yanıtı

{
  "error": {
    "code": "validation_failed",
    "message": "İstek doğrulaması başarısız oldu",
    "details": {
      "field": "datasetId",
      "reason": "Geçersiz GUID formatı"
    },
    "timestamp": "2024-01-15T10:30:00Z",
    "requestId": "req_12345"
  }
}

Yanıt Türleri

Başarılı Yanıtlar

Yapılandırılmış JSON veri ve metadata içeren HTTP 2xx durum kodları.

Hata Yanıtları

Detaylı hata bilgileri içeren HTTP 4xx/5xx durum kodları.

Sayfalandırma

Büyük veri seti yanıtlarında tutarlı sayfalandırma formatı.

HTTP Durum Kodları

Başarı Kodları (2xx)

Kod Durum Açıklama Kullanım
200 OK İstek başarılı, veri döndürüldü GET istekleri, başarılı işlemler
201 Created Kaynak başarıyla oluşturuldu Yeni kaynak oluşturan POST istekleri
202 Accepted İstek asenkron işlemler için kabul edildi Uzun süren işlemler, kuyruğa alınan görevler
204 No Content İstek başarılı, veri döndürülmedi DELETE istekleri, veri döndürmeyen güncellemeler

İstemci Hatası Kodları (4xx)

Kod Durum Açıklama Yaygın Sebepler
400 Bad Request Geçersiz istek formatı veya parametreler Eksik başlıklar, hatalı JSON, biçimsiz veri
401 Unauthorized Kimlik doğrulama gerekli veya başarısız Eksik/geçersiz token, süresi dolmuş kimlik bilgileri
403 Forbidden Geçerli kimlik doğrulama ancak yetersiz izinler Kısıtlı kullanıcı erişimi, yanlış tenant/proje
404 Not Found İstenen kaynak mevcut değil Geçersiz uç nokta, var olmayan kaynak ID'si
422 Unprocessable Entity Geçerli format ancak iş mantığı doğrulaması başarısız Geçersiz iş kuralları, kısıtlama ihlalleri
429 Too Many Requests Kota sınırı aşıldı Belirli zaman içinde çok fazla API çağrısı

Sunucu Hatası Kodları (5xx)

Kod Durum Açıklama Eylem
500 Internal Server Error Beklenmeyen sunucu hatası Üssel geri çekilmeyle yeniden dene
502 Bad Gateway Yukarı akış servis hatası Servis durumunu kontrol et, sonra yeniden dene
503 Service Unavailable Servis geçici olarak kullanılamıyor Gecikmeli yeniden dene, bakım kontrolü yap
504 Gateway Timeout İstek zaman aşımına uğradı Zaman aşımını artır, isteği optimize et

Yaygın Yanıt Desenleri

Tek Kaynak Yanıtı

{
  "actionId": "87654321-4321-4321-4321-210987654321",
  "actionType": "analyze",
  "status": "completed",
  "startTime": "2024-01-15T10:30:00Z",
  "endTime": "2024-01-15T10:32:15Z",
  "duration": 135,
  "result": {
    "outputId": "98765432-8765-4321-4321-987654321098",
    "recordsProcessed": 10000
  }
}

Sayfalandırma ile Koleksiyon Yanıtı

{
  "actions": [
    {
      "actionId": "87654321-4321-4321-4321-210987654321",
      "actionType": "analyze",
      "status": "completed"
    },
    {
      "actionId": "11111111-2222-3333-4444-555555555555",
      "actionType": "export",
      "status": "processing"
    }
  ],
  "pagination": {
    "currentPage": 1,
    "totalPages": 5,
    "totalItems": 100,
    "itemsPerPage": 20,
    "hasNext": true,
    "hasPrevious": false,
    "links": {
      "first": "/api/Action/history?page=1&limit=20",
      "next": "/api/Action/history?page=2&limit=20",
      "last": "/api/Action/history?page=5&limit=20"
    }
  }
}

Asenkron İşlem Yanıtı

{
  "operationId": "op_12345678-1234-1234-1234-123456789012",
  "status": "processing",
  "progress": {
    "percentage": 45,
    "currentStep": "data_analysis",
    "totalSteps": 5,
    "estimatedCompletion": "2024-01-15T10:35:00Z"
  },
  "trackingUrl": "/api/Execution/status/op_12345678-1234-1234-1234-123456789012",
  "message": "Veri seti analizi işleniyor..."
}

Hata Yanıtı Detayları

Doğrulama Hatası

{
  "error": {
    "code": "validation_failed",
    "message": "İstek doğrulaması başarısız oldu",
    "details": {
      "errors": [
        {
          "field": "datasetId",
          "code": "invalid_format",
          "message": "Geçerli bir GUID olmalıdır"
        },
        {
          "field": "parameters.timeout",
          "code": "out_of_range",
          "message": "1 ile 3600 saniye arasında olmalıdır"
        }
      ]
    },
    "timestamp": "2024-01-15T10:30:00Z",
    "requestId": "req_12345"
  }
}

Kimlik Doğrulama Hatası

{
  "error": {
    "code": "invalid_token",
    "message": "Sağlanan erişim tokenı geçersiz veya süresi dolmuş",
    "details": {
      "tokenType": "bearer",
      "expiresAt": "2024-01-15T09:00:00Z",
      "suggestion": "Lütfen erişim tokenınızı yenileyin"
    },
    "timestamp": "2024-01-15T10:30:00Z",
    "requestId": "req_12345"
  }
}

Kota Aşımı Hatası

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Bu uç nokta için kota sınırı aşıldı",
    "details": {
      "limit": 100,
      "remaining": 0,
      "resetTime": "2024-01-15T11:00:00Z",
      "retryAfter": 1800
    },
    "timestamp": "2024-01-15T10:30:00Z",
    "requestId": "req_12345"
  }
}

Yanıt Başlıkları

Standart Başlıklar

Başlık Açıklama Örnek
Content-Type Yanıt formatı application/json; charset=utf-8
X-Request-Id Benzersiz istek tanımlayıcısı req_12345678
X-Response-Time Sunucu işleme süresi 145ms
X-API-Version Kullanılan API sürümü 1.0.0

Kota Sınırlandırma Başlıkları

Başlık Açıklama Örnek
X-RateLimit-Limit Pencere başına maksimum istek sayısı 100
X-RateLimit-Remaining Pencere içinde kalan istekler 95
X-RateLimit-Reset Pencere sıfırlama zaman damgası 1642251600
Retry-After Yeniden deneme öncesi bekleme süresi (saniye) 3600

Hata Yönetimi İçin En İyi Uygulamalar

JavaScript Örneği

async function handleAPIResponse(response) {
  // Yanıtın başarılı olup olmadığını kontrol et
  if (!response.ok) {
    const errorData = await response.json();

    switch (response.status) {
      case 400:
        throw new ValidationError(errorData.error.message, errorData.error.details);
      case 401:
        throw new AuthenticationError('Kimlik doğrulama başarısız');
      case 403:
        throw new AuthorizationError('Yetersiz izinler');
      case 404:
        throw new NotFoundError('Kaynak bulunamadı');
      case 429:
        const retryAfter = response.headers.get('Retry-After');
        throw new RateLimitError(`Kota aşıldı. ${retryAfter} saniye sonra yeniden deneyin`);
      case 500:
      case 502:
      case 503:
      case 504:
        throw new ServerError('Sunucu hatası oluştu. Lütfen yeniden deneyin.');
      default:
        throw new APIError(`Beklenmeyen hata: ${response.status}`);
    }
  }

  return await response.json();
}

// Yeniden deneme mantığıyla kullanım
async function apiCallWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await fetch(url, options);
      return await handleAPIResponse(response);
    } catch (error) {
      if (error instanceof RateLimitError) {
        const retryAfter = parseInt(error.retryAfter) || Math.pow(2, attempt);
        await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
        continue;
      }

      if (error instanceof ServerError && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000; // Üssel geri çekilme
        await new Promise(resolve => setTimeout(resolve, delay));
        continue;
      }

      throw error;
    }
  }
}

Python Örneği

import requests
import time
from typing import Dict, Any

class APIError(Exception):
    def __init__(self, message: str, status_code: int = None, details: Dict = None):
        super().__init__(message)
        self.status_code = status_code
        self.details = details

def handle_api_response(response: requests.Response) -> Dict[str, Any]:
    """Doğru hata yönetimi ile API yanıtını işleme"""

    if response.ok:
        return response.json()

    try:
        error_data = response.json()
    except ValueError:
        error_data = {"error": {"message": response.text}}

    error_info = error_data.get("error", {})
    message = error_info.get("message", f"HTTP {response.status_code}")
    details = error_info.get("details", {})

    if response.status_code == 429:
        retry_after = response.headers.get('Retry-After', '60')
        raise APIError(f"Kota aşıldı. {retry_after} saniye sonra yeniden deneyin",
                      response.status_code, details)

    elif response.status_code >= 500:
        raise APIError(f"Sunucu hatası: {message}", response.status_code, details)

    elif response.status_code >= 400:
        raise APIError(f"İstemci hatası: {message}", response.status_code, details)

    raise APIError(f"Beklenmeyen hata: {message}", response.status_code, details)

def api_call_with_retry(url: str, method: str = 'GET', max_retries: int = 3, **kwargs) -> Dict[str, Any]:
    """Otomatik yeniden deneme mantığı ile API çağrısı yap"""

    for attempt in range(1, max_retries + 1):
        try:
            response = requests.request(method, url, **kwargs)
            return handle_api_response(response)

        except APIError as e:
            if e.status_code == 429:
                retry_after = int(e.details.get('retryAfter', 60))
                time.sleep(retry_after)
                continue

            elif e.status_code >= 500 and attempt < max_retries:
                delay = 2 ** attempt  # Üssel geri çekilme
                time.sleep(delay)
                continue

            raise

    raise APIError(f"Maksimum yeniden deneme sayısı ({max_retries}) aşıldı")

Sonraki Adımlar

Yanıt formatlarını şimdi anladığınıza göre, bu desenleri uygulamalı görmek için Actions, Blocks veya Datasets gibi belirli API bölümlerini keşfedin.