Yanıt Formatları
API Yanıt Yapılarını Anlama
mindzieAPI yanıt formatları, durum kodları, hata yönetimi kalıpları 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 formatını 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": {
// Sayfalı yanıtlarda 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",
"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ı.
Sayfalama
Büyük veri seti yanıtları için tutarlı sayfalama formatı.
HTTP Durum Kodları
Başarı Kodları (2xx)
| Kod | Durum | Açıklama | Kullanım |
|---|---|---|---|
200 |
Tamam | İstek başarılı, veri döndü | GET istekleri, başarılı işlemler |
201 |
Oluşturuldu | Kaynak başarıyla oluşturuldu | Yeni kaynak oluşturan POST istekleri |
202 |
Kabul Edildi | İstek asenkron işleme kabul edildi | Uzun süren işlemler, kuyruklanan görevler |
204 |
İçerik Yok | İstek başarılı, veri döndürülmedi | DELETE istekleri, veri döndürmeyen güncellemeler |
İstemci Hata Kodları (4xx)
| Kod | Durum | Açıklama | Yaygın Nedenler |
|---|---|---|---|
400 |
Geçersiz İstek | Geçersiz istek formatı veya parametreler | Eksik başlıklar, geçersiz JSON, bozuk veri |
401 |
Yetkisiz | Kimlik doğrulama gerekli veya başarısız | Eksik/geçersiz token, süresi dolmuş kimlik bilgileri |
403 |
Yasak | Geçerli kimlik bilgisi ancak yetersiz izinler | Sınırlı kullanıcı erişimi, yanlış tenant/proje |
404 |
Bulunamadı | İstenen kaynak mevcut değil | Geçersiz uç nokta, var olmayan kaynak ID'si |
422 |
İşlenemeyen Varlık | Format geçerli ancak iş mantığı doğrulaması başarısız | Geçersiz iş kuralları, kısıtlama ihlalleri |
429 |
Çok Fazla İstek | İstek oranı sınırı aşıldı | Zaman diliminde çok fazla API çağrısı |
Sunucu Hata Kodları (5xx)
| Kod | Durum | Açıklama | Eylem |
|---|---|---|---|
500 |
Dahili Sunucu Hatası | Beklenmeyen sunucu hatası | Üssel geri çekme ile yeniden dene |
502 |
Kötü Ağ Geçidi | Yukarı akış servis hatası | Servis durumunu kontrol et, daha sonra yeniden dene |
503 |
Hizmet Kullanılamıyor | Servis geçici olarak kullanılamıyor | Gecikmeli tekrar dene, bakım durumu kontrolü |
504 |
Ağ Geçidi Zaman Aşımı | İstek zaman aşımına uğradı | Zaman aşımını artır, isteği optimize et |
Yaygın Yanıt Kalıpları
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
}
}
Sayfalama 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 kümesi analizi işleniyor..."
}
Hata Yanıtı Detayları
Doğrulama Hatası
{
"error": {
"code": "validation_failed",
"message": "İstek doğrulaması başarısız",
"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 tokeni geçersiz veya süresi dolmuş",
"details": {
"tokenType": "bearer",
"expiresAt": "2024-01-15T09:00:00Z",
"suggestion": "Lütfen erişim tokeninizi yenileyin"
},
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_12345"
}
}
Oran Sınırı Hatası
{
"error": {
"code": "rate_limit_exceeded",
"message": "Bu uç nokta için oran 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 |
Tekil istek tanımlayıcısı | req_12345678 |
X-Response-Time |
Sunucu işlem süresi | 145ms |
X-API-Version |
Kullanılan API versiyonu | 1.0.0 |
Oran Sınırı Başlıkları
| Başlık | Açıklama | Örnek |
|---|---|---|
X-RateLimit-Limit |
Pencere başına maksimum istek sayısı | 100 |
X-RateLimit-Remaining |
Kalan istek sayısı | 95 |
X-RateLimit-Reset |
Pencere sıfırlama zaman damgası | 1642251600 |
Retry-After |
Yeniden deneme için bekleme süresi (saniye) | 3600 |
Hata Yönetimi İçin En İyi Uygulamalar
JavaScript Örneği
async function handleAPIResponse(response) {
// Yanıt başarılı mı 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(`Oran sınırına ulaşıldı. ${retryAfter} saniye sonra tekrar deneyin`);
case 500:
case 502:
case 503:
case 504:
throw new ServerError('Sunucu hatası oluştu. Lütfen tekrar deneyin.');
default:
throw new APIError(`Beklenmeyen hata: ${response.status}`);
}
}
return await response.json();
}
// Yeniden deneme mantığı ile 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 çekme
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]:
"""API yanıtını uygun hata yönetimi ile 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"Oran sınırlamasına takıldı. {retry_after} saniye sonra tekrar 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 çekme
time.sleep(delay)
continue
raise
raise APIError(f"En fazla yeniden deneme sayısı ({max_retries}) aşıldı")
API Veri Aktarım Nesneleri (DTO)
Aşağıda mindzieAPI uç noktalarında kullanılan önemli DTO'lar yer almaktadır.
Tenant DTO'ları
TenantListItemDto
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Ana tenant",
"caseCount": 50000,
"maxUserCount": 100,
"maxAnalystCount": 20,
"analystCount": 12,
"userCount": 45,
"preRelease": false,
"isAcademic": false,
"autoload": true,
"dateCreated": "2024-01-15T10:30:00Z",
"isDisabled": false
}
TenantDetailDto
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation",
"description": "Ana tenant",
"isAcademic": false,
"preRelease": false,
"maxUserCount": 100,
"maxAnalystCount": 20,
"maxCases": 100000,
"dateCreated": "2024-01-15T10:30:00Z",
"isDisabled": false
}
TenantUpdatedDto
{
"tenantId": "12345678-1234-1234-1234-123456789012",
"name": "acme-corp",
"displayName": "Acme Corporation Güncellendi",
"message": "'acme-corp' tenant başarıyla güncellendi",
"isDisabled": false
}
Kullanıcı (User) DTO'ları
UserListItemDto
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "john.smith@example.com",
"displayName": "John Smith",
"firstName": "John",
"lastName": "Smith",
"roleName": "Analyst",
"disabled": false,
"isServiceAccount": false,
"homeTenantId": null,
"homeTenantName": null,
"lastLogin": "2024-01-15T10:30:00Z",
"tenantCount": 2,
"tenantNames": "acme-corp, globex-inc",
"dateCreated": "2024-01-01T00:00:00Z"
}
UserCreatedDto
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "john.smith@example.com",
"displayName": "John Smith",
"message": "Kullanıcı başarıyla oluşturuldu"
}
Proje (Project) DTO'ları
ProjectReturn
{
"projectId": "87654321-4321-4321-4321-210987654321",
"tenantId": "12345678-1234-1234-1234-123456789012",
"projectName": "Satın Alma Siparişi Analizi",
"projectDescription": "P2P iş akışı süreç madenciliği analizi",
"dateCreated": "2024-01-15T10:30:00Z",
"dateModified": "2024-01-20T14:45:00Z",
"createdBy": "kullanıcı-guid",
"modifiedBy": "kullanıcı-guid",
"isActive": true,
"datasetCount": 3,
"investigationCount": 5,
"dashboardCount": 2,
"userCount": 8
}
ProjectSummaryReturn
{
"projectId": "87654321-4321-4321-4321-210987654321",
"projectName": "Satın Alma Siparişi Analizi",
"projectDescription": "Süreç madenciliği analizi",
"dateCreated": "2024-01-15T10:30:00Z",
"dateModified": "2024-01-20T14:45:00Z",
"statistics": {
"totalDatasets": 3,
"totalInvestigations": 5,
"totalDashboards": 2,
"totalNotebooks": 12,
"totalUsers": 8
}
}
ProjectUserReturn
{
"permissionId": "11111111-1111-1111-1111-111111111111",
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "john.smith@example.com",
"displayName": "John Smith",
"isOwner": true,
"dateAssigned": "2024-01-15T10:30:00Z"
}
ProjectThumbnailReturn
{
"projectId": "87654321-4321-4321-4321-210987654321",
"hasThumbnail": true,
"base64Image": "data:image/jpeg;base64,/9j/4AAQ..."
}
ProjectImportReturn
{
"success": true,
"projectId": "99999999-9999-9999-9999-999999999999",
"projectName": "İçe Aktarılan Proje",
"datasetsImported": 2,
"investigationsImported": 3,
"dashboardsImported": 1,
"errorMessage": null,
"message": "Proje başarıyla içe aktarıldı"
}
İnceleme (Investigation) DTO'ları
InvestigationReturn
{
"investigationId": "11111111-2222-3333-4444-555555555555",
"projectId": "87654321-4321-4321-4321-210987654321",
"investigationName": "Sipariş Analizi",
"investigationDescription": "Sipariş iş akışı süreç madenciliği analizi",
"datasetId": "12345678-1234-1234-1234-123456789012",
"dateCreated": "2024-01-15T10:30:00Z",
"dateModified": "2024-01-20T14:45:00Z",
"createdBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"modifiedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"investigationOrder": 1.0,
"isUsedForOperationCenter": false,
"investigationFolderId": null,
"notebookCount": 3
}
InvestigationListReturn
{
"investigations": [
{
"investigationId": "11111111-2222-3333-4444-555555555555",
"projectId": "87654321-4321-4321-4321-210987654321",
"investigationName": "Sipariş Analizi",
"datasetId": "12345678-1234-1234-1234-123456789012",
"notebookCount": 3
}
],
"totalCount": 5,
"page": 1,
"pageSize": 50
}
CreateInvestigationRequest
{
"investigationName": "Sipariş Analizi",
"investigationDescription": "Süreç madenciliği analizi",
"datasetId": "12345678-1234-1234-1234-123456789012",
"isUsedForOperationCenter": false
}
UpdateInvestigationRequest
{
"investigationName": "Güncellenmiş Analiz Adı",
"investigationDescription": "Güncellenmiş açıklama",
"isUsedForOperationCenter": true
}
Not Defteri (Notebook) DTO'ları
NotebookReturn
{
"notebookId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"investigationId": "11111111-2222-3333-4444-555555555555",
"name": "Ana",
"description": "Birincil analiz not defteri",
"dateCreated": "2024-01-15T10:30:00Z",
"dateModified": "2024-01-20T14:45:00Z",
"createdBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"modifiedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"notebookType": 0,
"notebookOrder": 1.0,
"lastExecutionDuration": 2.5,
"blockCount": 12
}
NotebookListReturn
{
"notebooks": [
{
"notebookId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"investigationId": "11111111-2222-3333-4444-555555555555",
"name": "Ana",
"notebookOrder": 1.0,
"blockCount": 12
}
],
"totalCount": 3
}
Sonraki Adımlar
Yanıt formatlarını anladığınıza göre, bu kalıpları uygulamada görmek için Actions, Blocks veya Datasets gibi belirli API bölümlerini keşfedin.