Bir REST API'de hata yanıtlarını nasıl standartlaştırırsınız? RFC 9457 Problem Details nedir?
Cevap
Tutarlı hata yanıtları, istemcilerin hataları programatik olarak işleyebilmesini sağlar. Endüstri standardı RFC 9457 Problem Details for HTTP APIs'tır (2023'te RFC 7807'nin yerini aldı). İçerik tipi application/problem+json'dur.
{
"type": "https://api.ornek.com/errors/insufficient-funds",
"title": "Yetersiz bakiye",
"status": 422,
"detail": "Hesap bakiyesi 30.00 TL, işlem tutarı 50.00 TL.",
"instance": "/payments/8f2c1",
"traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{ "field": "amount", "code": "exceeds_balance" }
]
}type: hata türünü tanımlayan URI (makine için sabit anahtar).title: kısa, insan okunur özet.status,detail,instance: HTTP kodu, bu olaya özel açıklama, ilgili kaynak.- Ek alanlar (extension members) serbesttir:
traceId,errorsgibi.
Doğru status code seçimi
| Durum | Kod |
|---|---|
| Geçersiz JSON, eksik alan | 400 |
| Kimlik doğrulanmadı | 401 |
| Yetki yok | 403 |
| Kaynak yok | 404 |
| Çakışma (duplicate, versiyon uyuşmazlığı) | 409 |
| Söz dizimi doğru ama iş kuralı ihlali | 422 |
| Rate limit | 429 (+ Retry-After) |
| Beklenmeyen sunucu hatası | 500 |
| Downstream servis yanıt vermiyor | 502 / 503 / 504 |
Uygulama
- Hataları tek bir yerde üretin: Spring'de
@RestControllerAdvice(Spring 6ProblemDetailsınıfını yerleşik destekler), ASP.NET Core'daAddProblemDetails()+UseExceptionHandler(), Express'te merkezi error middleware. - 500 hatalarında stack trace veya SQL mesajı dönmeyin; detayı loglayıp istemciye
traceIdverin. 200 OKgövdesinde{"success": false}döndürmek anti-pattern'dir; HTTP durum kodunu doğru kullanın.
İlgili API Tasarımı soruları
- HTTP 401 ile 403 durum kodları arasındaki fark nedir?
- JWT nedir? Session tabanlı kimlik doğrulamadan farkı nedir?
- Idempotency nedir? Hangi HTTP metotları idempotent'tir?
- OAuth 2.0 nedir? Authorization Code (PKCE) ve Client Credentials akışları nasıl çalışır?
- Rate limiting nedir? Token bucket ve sliding window algoritmalarını açıklayın.
- gRPC nedir? REST'ten farkı nedir ve ne zaman tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.