Bapati
Backend Geliştirme

REST API Nedir? Endpoint, HTTP Metotları, JSON ve Token

27 Temmuz 2026
6 dk okuma
REST API Nedir? Endpoint, HTTP Metotları, JSON ve Token

REST API nedir, nasıl tasarlanır? Endpoint, HTTP metotları, durum kodları ve JSON yapısını örneklerle ve sık yapılan hatalarla ele alıyoruz.

API Neyi Çözüyor?

Bir mobil uygulama, bir web arayüzü ve bir muhasebe sistemi aynı veriye ihtiyaç duyduğunda, her biri için ayrı bir veri erişim katmanı yazmak sürdürülebilir değildir. Kural bir yerde değişince üç yeri birden güncellemeniz gerekir — ve biri mutlaka unutulur.

API, veriyi ve iş kurallarını tek bir yerde toplayıp dışarıya standart bir arayüzle sunar. İstemcilerin hangi teknolojiyle yazıldığı önemsiz hale gelir. REST ise bu arayüzü HTTP'nin kendi kavramları üzerine kurma yaklaşımıdır: kaynaklar, adresler ve metotlar.

Kaynak ve Endpoint Tasarımı

REST'te her şey bir kaynaktır ve kaynaklar isimlerle temsil edilir, fiillerle değil. Fiili adres değil, HTTP metodu belirler.

YanlışDoğruNeden
GET /kullaniciGetir?id=5GET /kullanicilar/5Fiil metotta, kaynak adreste
POST /kullaniciSilDELETE /kullanicilar/5Silme işlemi DELETE'tir
GET /kullanici/5/siparisGetirGET /kullanicilar/5/siparislerHiyerarşi adreste görünür
GET /tumKullanicilarGET /kullanicilar?sayfa=2&adet=20Sayfalama olmadan liste büyür

Çoğul isim kullanmak ve hiyerarşiyi adreste göstermek okunabilirliği belirgin biçimde artırır. Ancak hiyerarşiyi ikiden fazla seviyeye taşımamak gerekir: /kullanicilar/5/siparisler/12/kalemler/3 yerine /siparis-kalemleri/3 hem daha kısa hem daha esnektir.

Liste uçları her zaman sayfalanmalıdır. Bugün 40 kayıt döndüren bir uç, iki yıl sonra 40.000 kayıt döndürür ve o gün hem sunucu hem istemci tarafında sorun çıkarır.

HTTP Metotları ve Anlamları

Bu anlamlara sadık kalmak yalnızca estetik bir tercih değildir; önbellekleme, yeniden deneme ve ara katman davranışları bu sözleşmeye göre çalışır.

MetotNe yaparGüvenliTekrarlanabilir
GETOkur, durumu değiştirmezEvetEvet
POSTYeni kayıt oluştururHayırHayır
PUTKaydı bütünüyle değiştirirHayırEvet
PATCHKaydın bir kısmını güncellerHayırGenelde evet
DELETESilerHayırEvet

"Tekrarlanabilir" sütunu pratikte kritiktir: ağ koptuğunda istemci isteği yeniden gönderir. PUT'u iki kez göndermek zararsızdır, POST'u iki kez göndermek iki sipariş demektir. Ödeme gibi kritik uçlarda bu yüzden istemciden bir idempotency key alıp aynı anahtarla gelen ikinci isteği yok saymak gerekir.

Durum Kodları: Sessiz Ama Kritik

Her cevabı 200 döndürüp hatayı gövdeye yazmak yaygın bir kestirme yoldur ve istemci tarafında karmaşaya yol açar: istemci artık her cevabın gövdesini ayrıştırmadan başarılı olup olmadığını bilemez.

KodAnlamıİstemci ne yapmalı
200 OKBaşarılıVeriyi kullan
201 CreatedKayıt oluşturulduLocation başlığını oku
204 No ContentBaşarılı, gövde yokGövde ayrıştırma
400 Bad Requestİstek geçersizKullanıcıya alan hatalarını göster
401 UnauthorizedKimlik doğrulanmadıGiriş ekranına yönlendir
403 ForbiddenKimlik var, yetki yok"Yetkiniz yok" mesajı
404 Not FoundKaynak yokBoş durum göster
409 ConflictÇakışma (mükerrer kayıt)Kullanıcıya sebebi söyle
422Biçim doğru, iş kuralı ihlaliKural mesajını göster
429Çok fazla istekRetry-After kadar bekle
500Sunucu hatasıGenel hata, tekrar dene

401 ile 403 arasındaki farkı doğru kullanmak, istemcinin kullanıcıya doğru mesajı göstermesini sağlar: biri "giriş yap" der, diğeri "yetkin yok". Karıştırıldığında kullanıcı, yetkisi olmadığı bir sayfada sonsuz döngüde oturum açmaya çalışır.

Tutarlı Cevap Zarfı

Bir endpoint düz metin, diğeri nesne, bir başkası hata durumunda bambaşka bir yapı döndürdüğünde istemci kodu hızla karmaşıklaşır. Tüm cevapları ortak bir zarf içinde döndürmek, istemci tarafında tek bir işleme kuralı yazmayı mümkün kılar.

// Başarılı
{
  "isSuccess": true,
  "data": { "id": 42, "ad": "Ayşe Yılmaz", "eposta": "ayse@ornek.com" },
  "message": null,
  "errors": []
}

// Doğrulama hatası — HTTP 400 ile birlikte
{
  "isSuccess": false,
  "data": null,
  "message": "Doğrulama hatası",
  "errors": [
    { "field": "eposta", "code": "INVALID_FORMAT", "message": "Geçerli bir e-posta girin" },
    { "field": "yas",    "code": "OUT_OF_RANGE",   "message": "Yaş 18'den küçük olamaz" }
  ]
}

Hata nesnesinde field ve code alanlarının bulunması iki şeyi mümkün kılar: arayüz hatayı doğru form alanının altında gösterebilir, ve istemci mesajın metnine değil koduna göre karar verebilir. Mesaj metnine dayanan istemci kodu, çeviri eklendiği gün kırılır.

Bu yaklaşımı kendi projelerimizde OperationResult deseniyle uyguluyoruz; hem başarı hem hata aynı biçimde dönüyor.

Filtreleme, Sıralama ve Alan Seçimi

Liste uçları pratikte hiçbir zaman "hepsini getir"den ibaret kalmaz. İstemci filtrelemek, sıralamak ve bazen yalnızca birkaç alanı istemek ister. Bunları her uç için ayrı ayrı icat etmek yerine tek bir sözleşmeye oturtmak gerekir.

GET /api/v1/siparisler
      ?durum=beklemede,onaylandi     # çoklu değer virgülle
      &olusturma_min=2026-01-01      # aralık: _min / _max
      &olusturma_max=2026-06-30
      &ara=yilmaz                    # serbest metin araması
      &sirala=-olusturmaTarihi,tutar  # başındaki "-" azalan demek
      &alanlar=id,tutar,durum         # yalnızca gerekli alanlar
      &sayfa=2&adet=20
KuralNeden
Sıralama alanları beyaz listedenRastgele sütun adı kabul etmek SQL enjeksiyonuna ve index'siz sorguya kapı açar
adet için üst sınıradet=1000000 tek istekle sunucuyu düşürebilir
Toplam sayı da dönsünİstemci sayfa sayısını hesaplayabilsin
Varsayılan sıralama sabit olsunSırasız sorguda aynı kayıt iki sayfada birden çıkabilir

Son madde sessiz bir hata kaynağıdır: veritabanı, açık bir ORDER BY olmadan satır sırasını garanti etmez. Sayfalama yapan her sorgunun benzersiz bir alanla (en azından ikincil olarak id ile) sıralanması gerekir.

Kimlik Doğrulama ve Token

Sunucunun her istekte kullanıcıyı yeniden tanıması gerekir. Token tabanlı yaklaşımda kullanıcı bir kez giriş yapar ve karşılığında imzalı bir token alır. Sonraki isteklerde bu token Authorization başlığında taşınır; sunucu imzayı doğrular, oturum bilgisini bellekte tutmak zorunda kalmaz.

GET /api/v1/siparisler?sayfa=1&adet=20 HTTP/1.1
Host: api.ornek.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Accept: application/json

Bir JWT üç bölümden oluşur ve orta bölümü şifreli değildir, yalnızca kodlanmıştır — herkes okuyabilir. İmza içeriğin değiştirilmediğini garanti eder, gizliliğini değil. Bu yüzden token'ın içine parola, TC kimlik numarası gibi hassas veri konmaz.

KonuDoğru yaklaşım
Erişim token'ı süresiKısa: 15 dakika – birkaç saat
Yenileme (refresh) token'ıUzun ömürlü, sunucuda iptal edilebilir
Saklama yeriHttpOnly çerez tercih edilir; localStorage XSS'e açıktır
İçerikKullanıcı kimliği ve roller — hassas veri yok
TaşımaYalnızca HTTPS üzerinden

Süresiz token, çalındığında sınırsız erişim demektir. Kısa ömürlü erişim token'ı + iptal edilebilir yenileme token'ı ikilisi, bu riski yönetilebilir bir pencereye indirir.

Sürümleme ve Belgeleme

Yayına çıkmış bir API'nin sözleşmesini bozmak, ona bağlı tüm istemcileri kırar. Burada ayrım nettir: ekleme kırıcı değildir, çıkarma ve değiştirme kırıcıdır.

DeğişiklikKırıcı mı
Cevaba yeni alan eklemekHayır
İsteğe bağlı yeni parametre eklemekHayır
Alan adını değiştirmekEvet
Alanı kaldırmakEvet
Alanın tipini değiştirmekEvet
Zorunlu yeni parametre eklemekEvet

Kırıcı değişiklikler sürüm üzerinden yönetilir; adres tabanlı sürümleme (/api/v1/...) en yaygın ve en okunabilir yöntemdir. Eski sürümü hemen kapatmak yerine bir süre yan yana çalıştırmak ve kaldırılacağını başlıkla duyurmak, istemci ekiplerine geçiş süresi tanır.

Swagger benzeri araçlarla üretilen canlı belgeler, API'yi kullanacak ekibin işini kolaylaştırdığı gibi kendi ekibiniz için de referans oluşturur. Belgelerin koddan üretilmesi ayrıca şu faydayı sağlar: belge, gerçekte çalışan koddan sapamaz.

Yayına Almadan Önce Kontrol Listesi

KonuNeden gerekli
Tüm liste uçlarında sayfalamaVeri büyüdükçe cevap ve bellek şişer
İstek hız sınırı (rate limit)Tek istemci tüm kapasiteyi tüketebilir
Girdi doğrulama, her uçtaİstemciye güvenilmez
CORS yalnızca bilinen kaynaklaraTarayıcıdan kötüye kullanımı engeller
Hata gövdesinde iç detay yokYığın izi saldırgana harita verir
Zaman alanları UTC ve ISO 8601Saat dilimi hataları en sinsi hatalardır
İstek kimliği (correlation id)Sorun çıktığında logda izlenebilsin

Bu listenin çoğu maddesi sonradan eklenmesi zor olan şeylerdir. Özellikle sayfalama ve sürümleme, ilk günden düşünülmediğinde geri dönüşü pahalı olan iki karardır.


Daha fazlası: REST API'yi temelden anlattığımız bölüm 'Her Yazılımcının Bilmesi Gerekenler' serimizde; BapatiVault serisinde ise .NET 8 ile sıfırdan bir API inşa ediyoruz.

Videoyu sitemizde izle  ·  YouTube'da aç  ·  Kanala abone ol


Daha fazlası: REST API kavramlarını uygulamalı gösterdiğimiz videoyla konuyu pekiştirebilirsiniz.

Videoyu sitemizde izle  ·  YouTube'da aç  ·  Bapati kanalına abone ol

Bir projeniz mi var?
Birlikte hayata geçirelim!

Dijital Dönüşümünüzü Başlatın

Yazılım geliştirme, sistem altyapısı, teknik danışmanlık veya eğitim! Hangi alanda ihtiyacınız varsa hemen görüşelim. İlk adımı siz atın, gerisini birlikte çözelim!