Yükleniyor...

REST API: Mobil Uygulama Geliştirme İçin Kapsamlı Rehber [2026]

Yazar: Burak Balkı | Kategori: Mobile Development | Okuma Süresi: 46 dk

Bu kapsamlı rehber, 2026 yılı itibarıyla mobil uygulama geliştirmenin temel taşı olan REST API'ları A'dan Z'ye ele alıyor. Temel kavramlardan ileri seviye op...

### Giriş: Mobil Dünyanın Omurgası REST API'lar 2026 yılı itibarıyla dünya genelinde 7 milyardan fazla mobil cihaz kullanımda ve bu cihazlardaki uygulamaların neredeyse tamamı, backend servisleriyle iletişim kurmak için API'lara bağımlı. Bu devasa ekosistemin temel taşlarından biri de şüphesiz REST API'lar. Peki, bu kritik teknoloji mobil uygulama geliştirme süreçlerinde neden bu kadar önemli? Bu kapsamlı rehberde, bir mobil uygulamanın backend'ini güçlendiren REST API'ları A'dan Z'ye ele alacak, temel kavramlardan ileri seviye optimizasyon tekniklerine kadar her yönüyle inceleyeceğiz. Amacımız, 2026'nın en güncel yaklaşımları ve pratik örneklerle, hem yeni başlayanların hem de deneyimli geliştiricilerin REST API dünyasında ustalaşmasını sağlamak. ## REST API Nedir? REST API (Representational State Transfer Application Programming Interface), istemci ile sunucu arasında veri alışverişini sağlayan, web servisleri geliştirmeye yönelik mimari bir stildir. HTTP protokolünü kullanarak kaynaklara (resource) erişim ve manipülasyon imkanı sunar. Mobil uygulamalar için REST API'lar, uygulamanın kullanıcı arayüzünden bağımsız olarak veriye erişmesini ve iş mantığını çalıştırmasını sağlayan kritik bir köprü görevi görür. REST mimarisi, 2000 yılında Roy Fielding tarafından doktora tezinde tanımlanmıştır ve o günden bu yana web servisleri geliştirmenin fiili standardı haline gelmiştir. Temel olarak, her şeyin bir kaynak (resource) olduğu ve bu kaynaklara URI (Uniform Resource Identifier) aracılığıyla erişildiği bir yaklaşımdır. İstemciler (mobil uygulamalarımız) bu kaynaklar üzerinde standart HTTP metotlarını (GET, POST, PUT, DELETE vb.) kullanarak CRUD (Create, Read, Update, Delete) operasyonları gerçekleştirirler. Bu sayede, mobil uygulamalarımız dinamik verilerle çalışabilir, kullanıcı etkileşimlerini işleyebilir ve backend servislerinin gücünden faydalanabilir. ## Neden REST API Kullanmalısınız? Mobil uygulama geliştirme ekosisteminde REST API'ların bu denli popüler olmasının pek çok geçerli nedeni bulunmaktadır. 2026 itibarıyla, bu nedenler hala geçerliliğini korumakta ve hatta bazıları daha da önem kazanmaktadır. * **Basitlik ve Kolay Öğrenilebilirlik:** HTTP protokolünü temel alması ve standart metotları kullanması sayesinde, REST API'lar oldukça basit bir yapıya sahiptir. Bu, geliştiricilerin öğrenme eğrisini düşürür ve hızlıca API geliştirmeye başlamalarını sağlar. * **Ölçeklenebilirlik:** REST'in stateless (durumsuz) doğası, sunucuların istemci oturum bilgilerini tutma yükünü ortadan kaldırır. Bu, yatay ölçeklemeyi (horizontal scaling) kolaylaştırır; yani daha fazla sunucu ekleyerek API'nizin yükünü dağıtabilirsiniz. Mobil uygulamaların kullanıcı tabanları hızla büyüyebileceğinden, bu özellik kritik öneme sahiptir. * **Platform Bağımsızlığı:** REST API'lar, veri formatı olarak genellikle JSON veya XML kullanır. Bu formatlar, mobil uygulamaların geliştirildiği platform (iOS, Android, React Native, Flutter) veya programlama dilinden bağımsız olarak kolayca tüketilebilir. Bu, farklı platformlar için tek bir backend API'si yazma imkanı sunar. * **Performans:** Caching (önbellekleme) mekanizmaları sayesinde, sıkça istenen veriler istemci tarafında veya ara katmanlarda önbelleğe alınabilir. Bu, tekrar eden isteklerde sunucuya gitme ihtiyacını azaltarak mobil uygulamaların tepki süresini ve genel performansını artırır. * **Esneklik:** REST, mimari bir stil olduğundan, belirli bir teknoloji veya programlama diline bağlı değildir. Ekibiniz Python, Node.js, Java veya Go gibi dilediği bir dilde REST API geliştirebilirken, mobil ekibiniz Swift, Kotlin veya JavaScript ile bu API'ları tüketebilir. * **Geniş Ekosistem ve Topluluk Desteği:** REST API'lar, web geliştirme dünyasının en köklü ve yaygın teknolojilerinden biridir. Bu, sayısız kütüphane, araç, dokümantasyon ve geniş bir geliştirici topluluğu anlamına gelir. Karşılaştığınız herhangi bir problemde Stack Overflow gibi platformlarda veya resmi dökümantasyonlarda kolayca çözüm bulabilirsiniz. Bu durum, özellikle 2026 itibarıyla mobil geliştirme alanında yeni teknolojilerle entegrasyonu kolaylaştırmaktadır. REST API'lar, mobil uygulamaların veri ihtiyaçlarını karşılamak ve karmaşık iş mantıklarını sunucu tarafında yürütmek için ideal bir çözümdür. Ancak, her teknoloji gibi, kullanım senaryosuna göre alternatifleri de değerlendirmek önemlidir. ## REST API vs Alternatifler REST API, web servisleri dünyasında baskın bir rol oynasa da, özellikle 2026 itibarıyla mobil geliştirme ihtiyaçlarına yönelik farklı mimari yaklaşımlar da bulunmaktadır. İşte REST API'ın en popüler alternatifleriyle bir karşılaştırma: | Özellik | REST API | GraphQL | gRPC | | :------------------ | :----------------------------------------- | :------------------------------------------ | :------------------------------------------ | | **Veri Alma** | Sabit endpoint'ler, fazla/eksik veri riski | İstemci istediği veriyi sorgular (tek endpoint) | Protobuf tanımlarına göre tip güvenli metotlar | | **Performans** | HTTP/1.1 (genellikle JSON), önbellekleme | HTTP/2 (genellikle JSON), `n+1` sorunu riski | HTTP/2 (Protobuf), ikili format, yüksek performans | | **Öğrenme Eğrisi** | Düşük, HTTP standartlarına yakın | Orta, sorgu dili öğrenimi gerektirir | Yüksek, Protobuf ve kod üretimi gerektirir | | **Ekosistem** | Çok geniş, olgun kütüphaneler | Hızla büyüyor, birçok istemci/sunucu kütüphanesi | Gelişmekte, özellikle mikroservislerde popüler | | **Topluluk** | Çok büyük ve aktif | Büyük ve aktif | Orta, daha çok kurumsal/büyük ölçekli projelerde | | **Kurumsal Destek** | Çok yaygın, endüstri standardı | Facebook tarafından geliştirildi | Google tarafından geliştirildi | | **Kullanım Alanı** | Genel web/mobil API'ları, basit entegrasyon | Karmaşık veri grafikleri, mobil (bant genişliği) | Mikroservisler arası iletişim, IoT, düşük gecikme | **Yorum:** REST API, genel amaçlı mobil uygulamalar için hala en yaygın ve erişilebilir seçenektir. GraphQL, özellikle mobil uygulamalarda `over-fetching` (gereğinden fazla veri çekme) veya `under-fetching` (gereğinden az veri çekme) problemlerini çözmek için tasarlanmıştır ve esneklik sunar. gRPC ise düşük gecikme, yüksek performans ve tip güvenliği gerektiren mikroservis mimarileri veya IoT gibi alanlarda öne çıkar. Mobil geliştiriciler, projelerinin özel ihtiyaçlarına göre bu üç seçenekten birini veya hibrit bir yaklaşımı tercih edebilirler. ## Kurulum ve İlk Adımlar: Basit Bir REST API Oluşturma Bu bölümde, mobil uygulamanızın kullanabileceği basit bir REST API'ı Node.js ve Express.js kullanarak nasıl oluşturacağınızı adım adım göstereceğiz. 2026 itibarıyla Node.js, hızlı API prototipleme ve üretim ortamında dahi yüksek performans sunmasıyla popülerliğini korumaktadır. **Ön Gereksinimler:** * Node.js (LTS sürümü, 20.x veya üzeri önerilir) ve npm yüklü olmalı. * Tercihen bir kod editörü (VS Code gibi). **Adım 1: Proje Dizinini Oluşturma ve Başlatma** İlk olarak, projeniz için bir dizin oluşturun ve terminalinizde bu dizine gidin. Ardından `npm init -y` komutu ile yeni bir Node.js projesi başlatın. ```bash mkdir mobil-rest-api cd mobil-rest-api npm init -y ``` **Adım 2: Express.js ve Diğer Bağımlılıkları Yükleme** API'mizi oluşturmak için Express.js framework'ünü ve JSON body'lerini parse etmek için `body-parser`'ı yüklememiz gerekecek. `cors` paketi, mobil uygulamanızın API'ye farklı bir domain'den erişebilmesi için önemlidir. ```bash npm install express body-parser cors ``` **Adım 3: `server.js` Dosyasını Oluşturma** Proje kök dizininizde `server.js` adında bir dosya oluşturun ve içine aşağıdaki kodları yapıştırın. ```javascript // server.js const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const app = express(); const PORT = process.env.PORT || 3000; // Middleware'ler app.use(cors()); // CORS'u etkinleştir app.use(bodyParser.json()); // JSON body'leri parse et // Basit bir veri deposu (gerçek projelerde veritabanı kullanılır) let users = [ { id: '1', name: 'Burak Balkı', email: 'burak@example.com' }, { id: '2', name: 'Ayşe Yılmaz', email: 'ayse@example.com' } ]; // GET tüm kullanıcıları getir app.get('/api/users', (req, res) => { console.log('GET /api/users isteği alındı.'); res.status(200).json(users); }); // GET belirli bir kullanıcıyı ID'ye göre getir app.get('/api/users/:id', (req, res) => { const { id } = req.params; const user = users.find(u => u.id === id); if (user) { res.status(200).json(user); } else { res.status(404).json({ message: 'Kullanıcı bulunamadı.' }); } }); // POST yeni kullanıcı oluştur app.post('/api/users', (req, res) => { const newUser = req.body; if (!newUser.name || !newUser.email) { return res.status(400).json({ message: 'İsim ve e-posta zorunludur.' }); } newUser.id = String(users.length + 1); // Basit ID ataması users.push(newUser); console.log('POST /api/users isteği alındı, yeni kullanıcı:', newUser); res.status(201).json(newUser); // 201 Created }); // PUT kullanıcı güncelle app.put('/api/users/:id', (req, res) => { const { id } = req.params; const updatedUser = req.body; let userFound = false; users = users.map(user => { if (user.id === id) { userFound = true; return { ...user, ...updatedUser }; } return user; }); if (userFound) { console.log('PUT /api/users/:id isteği alındı, güncellenen kullanıcı:', updatedUser); res.status(200).json(users.find(u => u.id === id)); } else { res.status(404).json({ message: 'Kullanıcı bulunamadı.' }); } }); // DELETE kullanıcı sil app.delete('/api/users/:id', (req, res) => { const { id } = req.params; const initialLength = users.length; users = users.filter(user => user.id !== id); if (users.length < initialLength) { console.log('DELETE /api/users/:id isteği alındı, silinen ID:', id); res.status(204).send(); // 204 No Content } else { res.status(404).json({ message: 'Kullanıcı bulunamadı.' }); } }); // Sunucuyu başlat app.listen(PORT, () => { console.log(`Sunucu http://localhost:${PORT} adresinde çalışıyor.`); console.log('API endpointleri: GET /api/users GET /api/users/:id POST /api/users PUT /api/users/:id DELETE /api/users/:id'); }); ``` **Adım 4: API'yi Çalıştırma** Terminalinizde aşağıdaki komutu çalıştırarak API'nizi başlatın: ```bash node server.js ``` Artık `http://localhost:3000` adresinde çalışan bir REST API'niz var! Bu API'ye mobil uygulamanızdan veya bir araç (Postman, Insomnia, curl) ile erişebilirsiniz. ## Temel Kullanım ve Örnekler: Mobil Uygulama Entegrasyonu Mobil uygulamalarınızda bu REST API'yi nasıl tüketeceğinize dair pratik örnekler sunalım. Örneklerde genellikle JavaScript tabanlı bir ortam (React Native, Expo) veya genel HTTP istek prensipleri üzerinden ilerleyeceğiz, zira temel mantık platformdan bağımsızdır. ### Örnek 1: Tüm Kullanıcıları Listeleme (GET) **Problem:** Mobil uygulamanızda kayıtlı tüm kullanıcıları bir liste olarak göstermek istiyorsunuz. **Çözüm:** API'nin `/api/users` endpoint'ine bir GET isteği göndereceğiz. ```javascript // React Native veya benzeri bir JS ortamında Fetch API kullanımı async function getUsers() { try { const response = await fetch('http://localhost:3000/api/users'); if (!response.ok) { throw new Error(`HTTP hata kodu: ${response.status}`); } const data = await response.json(); console.log('Kullanıcılar:', data); // Mobil uygulamanızın UI'ında bu veriyi kullanın return data; } catch (error) { console.error('Kullanıcıları çekerken hata oluştu:', error); // Hata durumunu kullanıcıya göster } } // Kullanım getUsers(); ``` ### Örnek 2: Yeni Kullanıcı Oluşturma (POST) **Problem:** Kullanıcının form aracılığıyla girdiği bilgilerle yeni bir kullanıcı kaydı oluşturmak istiyorsunuz. **Çözüm:** `/api/users` endpoint'ine POST isteği ile JSON formatında kullanıcı verilerini göndereceğiz. ```javascript async function createUser(name, email) { try { const response = await fetch('http://localhost:3000/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name, email }), }); if (!response.ok) { const errorData = await response.json(); throw new Error(`HTTP hata kodu: ${response.status}, Mesaj: ${errorData.message}`); } const newUser = await response.json(); console.log('Yeni kullanıcı oluşturuldu:', newUser); // Başarılı kaydı kullanıcıya bildirin return newUser; } catch (error) { console.error('Kullanıcı oluşturulurken hata oluştu:', error); } } // Kullanım createUser('Cem Demir', 'cem@example.com'); ``` ### Örnek 3: Mevcut Kullanıcıyı Güncelleme (PUT) **Problem:** Bir kullanıcının bilgilerini (örneğin e-posta adresi) güncellemek istiyorsunuz. **Çözüm:** `/api/users/:id` endpoint'ine PUT isteği ile güncellenmiş verileri göndereceğiz. ```javascript async function updateUser(id, newName, newEmail) { try { const response = await fetch(`http://localhost:3000/api/users/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: newName, email: newEmail }), }); if (!response.ok) { const errorData = await response.json(); throw new Error(`HTTP hata kodu: ${response.status}, Mesaj: ${errorData.message}`); } const updatedUser = await response.json(); console.log('Kullanıcı güncellendi:', updatedUser); return updatedUser; } catch (error) { console.error('Kullanıcı güncellenirken hata oluştu:', error); } } // Kullanım updateUser('1', 'Burak Balkı (Güncellendi)', 'burak.balki.updated@example.com'); ``` ### Örnek 4: Kullanıcı Silme (DELETE) **Problem:** Bir kullanıcının hesabını silmek istiyorsunuz. **Çözüm:** `/api/users/:id` endpoint'ine DELETE isteği göndereceğiz. ```javascript async function deleteUser(id) { try { const response = await fetch(`http://localhost:3000/api/users/${id}`, { method: 'DELETE', }); if (response.status === 204) { console.log(`Kullanıcı ID ${id} başarıyla silindi.`); // Başarılı silme işlemini kullanıcıya bildirin } else if (response.status === 404) { const errorData = await response.json(); throw new Error(`HTTP hata kodu: ${response.status}, Mesaj: ${errorData.message}`); } else { throw new Error(`Beklenmedik HTTP hata kodu: ${response.status}`); } } catch (error) { console.error('Kullanıcı silinirken hata oluştu:', error); } } // Kullanım deleteUser('2'); ``` ### Örnek 5: Hata Yönetimi ve Durum Kodları **Problem:** API'den gelen hataları doğru bir şekilde işlemek ve kullanıcıya anlamlı geri bildirimler sunmak. **Çözüm:** HTTP durum kodlarını ve API'nin döndürdüğü hata mesajlarını kontrol edeceğiz. ```javascript async function getNonExistentUser(id) { try { const response = await fetch(`http://localhost:3000/api/users/${id}`); if (!response.ok) { const errorData = await response.json(); // Hata durumuna göre farklı işlemler yapabiliriz if (response.status === 404) { console.warn(`Kullanıcı bulunamadı: ${errorData.message}`); // Kullanıcıya "Kayıt bulunamadı" mesajı göster } else if (response.status === 401) { console.error(`Yetkilendirme hatası: ${errorData.message}`); // Kullanıcıyı giriş sayfasına yönlendir } else { console.error(`Genel API hatası: ${errorData.message}`); // Genel bir hata mesajı göster } throw new Error(`API hatası: ${response.status}`); } const data = await response.json(); console.log('Kullanıcı:', data); } catch (error) { console.error('İstek sırasında bir hata oluştu:', error); } } // Kullanım (olmayan bir ID ile) getNonExistentUser('999'); ``` Bu örnekler, mobil uygulamanızda REST API'yi nasıl kullanacağınıza dair temel bir anlayış sunmaktadır. Gerçek dünya projelerinde, bu temel yapılandırmaların üzerine daha karmaşık kimlik doğrulama, yetkilendirme ve veri doğrulama mekanizmaları inşa edilecektir. ## İleri Seviye Teknikler: Mobil Uygulamalar İçin REST API Optimizasyonu Deneyimli bir mobil geliştirici olarak, sadece API'leri tüketmekle kalmaz, aynı zamanda onları daha verimli, güvenli ve sürdürülebilir hale getirme yollarını da ararsınız. 2026 itibarıyla mobil uygulama geliştirme pratiklerinde öne çıkan bazı ileri seviye REST API teknikleri şunlardır: ### 1. Versioning (Versiyonlama) API'niz geliştikçe, yeni özellikler eklenecek, mevcut endpoint'ler değişecek veya kaldırılacaktır. Bu değişikliklerin mevcut mobil uygulamaları bozmaması için versiyonlama kritik öneme sahiptir. * **URI Versiyonlama (Önerilmez):** `api.example.com/v1/users`, `api.example.com/v2/users`. Dezavantajı, URI'nin değişmesi ve önbellekleme sorunları yaratabilmesidir. * **Header Versiyonlama:** `Accept: application/vnd.example.v1+json`. HTTP `Accept` header'ını kullanarak versiyon belirtmek, daha temiz URI'ler sağlar. * **Query Param Versiyonlama (En Yaygın):** `api.example.com/users?version=1`. En basit yöntemdir, ancak URI'yi kirletebilir. > **Pro Tip:** Mobil uygulamalar genellikle uzun destek süreleri gerektirdiğinden, API versiyonlaması olmazsa olmazdır. Yeni bir mobil uygulama sürümü yayınlarken, eski API versiyonlarını bir süre daha desteklemeyi planlayın. ### 2. Caching (Önbellekleme) Tekrar eden isteklerde veriyi yeniden işlememek ve ağ trafiğini azaltmak için önbellekleme hayati öneme sahiptir. Mobil uygulamalar için, istemci tarafında (uygulama içinde) veya API Gateway seviyesinde önbellekleme yapılabilir. * **HTTP Caching Headers:** API yanıtlarında `Cache-Control`, `Expires`, `ETag`, `Last-Modified` gibi HTTP header'larını kullanarak istemci tarafında önbellekleme davranışını kontrol edebilirsiniz. Mobil uygulamanızın HTTP istemcisi (örneğin Alamofire, Retrofit) bu header'ları otomatik olarak işleyebilir. * **CDN Kullanımı:** Statik veya az değişen veriler için CDN (Content Delivery Network) kullanmak, coğrafi olarak yakın sunuculardan veri sunarak gecikmeyi önemli ölçüde azaltır. ### 3. Pagination (Sayfalama) Büyük veri kümelerini (örneğin binlerce ürün, yüzbinlerce kullanıcı) tek seferde mobil uygulamaya göndermek hem performansı düşürür hem de bant genişliğini tüketir. Sayfalama, veriyi küçük parçalar halinde (sayfalar) almanızı sağlar. * **Offset-Limit:** `GET /api/products?offset=0&limit=10`. Belirli bir başlangıç noktasından (offset) itibaren belirli sayıda (limit) kayıt getirir. Dezavantajı, araya yeni kayıtlar eklendiğinde veya silindiğinde kaymalar (pagination drift) yaşanabilmesidir. * **Cursor-Based (Anahtar Tabanlı):** `GET /api/products?after_id=123&limit=10`. Son alınan kaydın ID'sini (cursor) kullanarak bir sonraki sayfayı getirir. Daha tutarlıdır ve daha iyi performans sunar, özellikle sürekli veri akışı olan yerlerde tercih edilir. ### 4. Rate Limiting (İstek Sınırlaması) API'nizi kötü niyetli veya aşırı kullanımdan korumak için rate limiting uygulamak önemlidir. Bu, bir kullanıcının veya IP adresinin belirli bir zaman diliminde yapabileceği istek sayısını sınırlar. * **Neden Önemli:** DDoS saldırılarını önler, sunucu kaynaklarını korur, API'nizin adil kullanımını sağlar. * **Nasıl Uygulanır:** Genellikle API Gateway seviyesinde veya Express.js gibi framework'lerde middleware'ler aracılığıyla uygulanır. HTTP yanıtlarında `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` gibi header'lar ile istemciye bilgi verilir. ```javascript // Express.js'te basit bir rate limiting middleware örneği (2026 itibarıyla popüler) const rateLimit = require('express-rate-limit'); const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 dakika max: 100, // Her IP'den 15 dakika içinde maksimum 100 istek message: 'Çok fazla istek yaptınız, lütfen daha sonra tekrar deneyin.', headers: true, // Rate limit bilgilerini header'larda gönder }); app.use('/api/', apiLimiter); // Tüm /api rotalarına uygula ``` ### 5. API Gateway Kullanımı Büyük ölçekli mobil uygulamalar ve mikroservis mimarileri için API Gateway, API yönetimini merkezileştiren kritik bir bileşendir. AWS API Gateway, Azure API Management, Kong, Ocelot gibi çözümler popülerdir. * **Faydaları:** Kimlik doğrulama/yetkilendirme, rate limiting, önbellekleme, loglama, monitoring, request/response dönüşümü gibi işlemleri tek bir noktadan yönetir. * **Mobil İçin Önemi:** Mobil istemcilerin doğrudan mikroservislerle iletişim kurmak yerine tek bir API Gateway ile konuşmasını sağlayarak karmaşıklığı azaltır ve güvenlik katmanı ekler. Bu ileri seviye teknikler, REST API'larınızın mobil uygulamalarınızla uyumlu, yüksek performanslı ve güvenli çalışmasını sağlamak için 2026'da vazgeçilmezdir. ## Best Practices & Anti-Patterns REST API geliştirirken ve mobil uygulamalarla entegre ederken uyulması gereken belirli pratikler ve kaçınılması gereken hatalar vardır. Bu kurallar, API'nizin sürdürülebilirliğini, performansını ve güvenliğini doğrudan etkiler. ### ✅ Best Practices (En İyi Uygulamalar) 1. **Kaynak Odaklı Tasarım:** API'nizdeki her şeyi bir kaynak olarak düşünün ve bu kaynakları açıklayıcı, çoğul isimlerle adlandırın (örn: `/users`, `/products`, `/orders`). 2. **Doğru HTTP Metotları Kullanımı:** Her operasyon için uygun HTTP metodunu kullanın (GET için veri alma, POST için oluşturma, PUT/PATCH için güncelleme, DELETE için silme). 3. **Anlamlı Durum Kodları:** Başarılı veya hatalı her yanıt için doğru HTTP durum kodunu döndürün (örn: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error). 4. **Hatasız ve Açıklayıcı Hata Mesajları:** Hatalı durumlarda, istemcinin sorunu anlamasına yardımcı olacak açıklayıcı hata mesajları ve tercihen bir hata kodu döndürün. JSON formatında standart bir hata yapısı kullanın. 5. **Stateless (Durumsuz) Olma:** Her isteğin, sunucunun önceki isteklerden herhangi bir bilgi tutmasını gerektirmeyen bağımsız bir işlem olmasını sağlayın. Bu, ölçeklenebilirliği artırır. 6. **Kimlik Doğrulama (Authentication) ve Yetkilendirme (Authorization):** Mobil uygulamalar için JWT (JSON Web Tokens) veya OAuth 2.0 gibi güvenli kimlik doğrulama yöntemlerini kullanın. Her isteğin yetkilendirme kontrolünden geçtiğinden emin olun. 7. **Veri Doğrulama (Validation):** Gelen her isteğin payload'unu sunucu tarafında mutlaka doğrulayın. Yanlış veya eksik verinin işlenmesini engelleyin. 8. **Güvenli İletişim (HTTPS):** Tüm API iletişimini HTTPS üzerinden şifreleyin. Bu, özellikle mobil uygulamalar için kritik olan veri gizliliğini ve bütünlüğünü sağlar. (2026'da HTTP kullanımı kabul edilemez). 9. **Dokümantasyon:** API'nizi OpenAPI (Swagger) gibi araçlarla dokümante edin. Mobil geliştiricilerin API'nizi kolayca anlamasını ve entegre etmesini sağlar. 10. **Sürdürülebilirlik:** Kodunuzu temiz, modüler ve test edilebilir tutun. Gelecekteki değişiklikleri kolaylaştırır. ### ❌ Anti-Patterns (Kaçınılması Gereken Hatalar) 1. **URL'de Fiil Kullanımı:** `/getAllUsers`, `/deleteProduct` gibi fiil içeren URL'lerden kaçının. HTTP metotları (GET, DELETE) zaten bu eylemleri ifade eder. Doğrusu: `/users`, `/products/{id}`. 2. **Durum Bilgisi Tutma:** Sunucunun istemci oturum bilgilerini tutması (session-based authentication gibi). Bu, ölçeklenebilirliği sınırlar. 3. **Tek Bir Endpoint (God Endpoint):** Tüm operasyonları tek bir `/api` endpoint'i üzerinden yapmak. Bu, API'yi karmaşık ve yönetilemez hale getirir. 4. **Yanlış HTTP Metotları:** POST ile veri okuma veya GET ile veri değiştirme gibi yanlış metot kullanımları. REST prensiplerini ihlal eder. 5. **Yetersiz Hata Mesajları:** Sadece `500 Internal Server Error` döndürmek ve detay vermemek. Mobil uygulamaların hatayı anlamasını ve kullanıcıya doğru geri bildirim vermesini engeller. 6. **Güvenlik Açıkları:** API Key'leri doğrudan mobil uygulama koduna gömmek, yetersiz doğrulama yapmak, SQL Injection veya XSS gibi saldırılara açık olmak. 7. **Versiyonlamayı İhmal Etmek:** API'nizi versiyonlamamak, gelecekteki değişikliklerde mevcut mobil uygulamaları kırma riskini taşır. 8. **Gereksiz Veri Aktarımı (Over-fetching):** İstemcinin ihtiyacı olandan daha fazla veri döndürmek. Mobil cihazlarda bant genişliği ve pil ömrü açısından verimsizdir. Bu best practice'leri uygulayarak ve anti-pattern'lardan kaçınarak, mobil uygulamalarınız için sağlam, güvenli ve performanslı REST API'lar geliştirebilirsiniz. ## Yaygın Hatalar ve Çözümleri REST API'larla çalışırken, özellikle mobil uygulama geliştiricileri olarak sıkça karşılaşılan bazı sorunlar ve bunların çözümleri vardır. İşte 2026 itibarıyla hala popüler olan bazı yaygın hatalar ve düzeltme yolları: ### 1. CORS Hatası (Cross-Origin Resource Sharing) * **Problem:** Mobil uygulamanız (veya geliştirme ortamınızdaki web uygulaması) API'nizden farklı bir domain veya port üzerinde çalışıyorsa, tarayıcı güvenlik politikaları nedeniyle API'ye istek gönderemeyebilir. Hata genellikle `Access to XMLHttpRequest at 'http://localhost:3000/api/users' from origin 'http://localhost:19006' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.` şeklinde görünür. * **Sebep:** Sunucu, isteği gönderen kaynağın (origin) API'ye erişimine izin vermiyor. * **Çözüm:** API sunucunuzda CORS'u etkinleştirmeniz gerekir. Express.js örneğimizde `cors` middleware'ini kullandık. Belirli originlere izin vermek için `cors` seçeneklerini özelleştirebilirsiniz: ```javascript // Sadece belirli originlere izin ver app.use(cors({ origin: ['http://localhost:19006', 'https://your-mobile-app-domain.com'], methods: ['GET', 'POST', 'PUT', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization'] })); ``` ### 2. Ağ Bağlantısı Sorunları / Zaman Aşımı (Network Issues / Timeout) * **Problem:** Mobil uygulama API'ye istek gönderiyor ancak yanıt alamıyor veya çok uzun sürüyor. Hata mesajı genellikle `Network request failed` veya `Timeout` şeklinde olabilir. * **Sebep:** Mobil cihazın internet bağlantısı yok, API sunucusu çalışmıyor, API sunucusu aşırı yüklü veya yanıt süresi çok uzun. * **Çözüm:** * Mobil uygulamada ağ bağlantısını kontrol edin. * API sunucusunun çalıştığından emin olun. * İsteklerinizde makul bir zaman aşımı (timeout) süresi belirleyin ve kullanıcıya uygun bir hata mesajı gösterin. * API tarafında performans darboğazlarını (veritabanı sorguları, uzun süren işlemler) optimize edin. ```javascript // Fetch API'de timeout için AbortController kullanımı async function fetchDataWithTimeout(url, options, timeout = 5000) { const controller = new AbortController(); const id = setTimeout(() => controller.abort(), timeout); try { const response = await fetch(url, { ...options, signal: controller.signal }); clearTimeout(id); return response; } catch (error) { clearTimeout(id); if (error.name === 'AbortError') { throw new Error('İstek zaman aşımına uğradı.'); } throw error; } } // Kullanım: // fetchDataWithTimeout('http://localhost:3000/api/users', { method: 'GET' }, 3000); ``` ### 3. Kimlik Doğrulama/Yetkilendirme Hataları (401 Unauthorized, 403 Forbidden) * **Problem:** Mobil uygulama API'ye istek gönderiyor ancak `401 Unauthorized` veya `403 Forbidden` yanıtı alıyor. * **Sebep:** * `401 Unauthorized`: İstemci kimlik doğrulama bilgisi (token, API key) sağlamadı veya sağladığı bilgi geçersiz. * `403 Forbidden`: İstemci kimliği doğrulandı ancak istenen kaynağa veya eyleme erişim yetkisi yok. * **Çözüm:** * Mobil uygulamadan gönderilen isteklerde doğru kimlik doğrulama token'ının `Authorization` header'ında `Bearer` şemasıyla gönderildiğinden emin olun. * Token'ın süresinin dolmadığını kontrol edin. * API tarafında, token doğrulama mantığını ve yetkilendirme (rol tabanlı erişim kontrolü gibi) kurallarını gözden geçirin. ```javascript async function getAuthorizedData(token) { try { const response = await fetch('http://localhost:3000/api/secure-data', { method: 'GET', headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.status === 401) { console.error('Yetkilendirme hatası: Token geçersiz veya eksik.'); // Kullanıcıyı giriş sayfasına yönlendir } else if (response.status === 403) { console.error('Erişim reddedildi: Bu kaynağa erişim yetkiniz yok.'); // Kullanıcıya yetki hatası mesajı göster } else if (!response.ok) { throw new Error(`API hatası: ${response.status}`); } const data = await response.json(); console.log('Güvenli veri:', data); } catch (error) { console.error('Güvenli veri çekilirken hata oluştu:', error); } } ``` ### 4. Veri Doğrulama Hataları (400 Bad Request) * **Problem:** Mobil uygulama API'ye veri gönderiyor (POST/PUT) ancak `400 Bad Request` yanıtı alıyor. * **Sebep:** Gönderilen veri, API'nin beklediği formata veya doğrulama kurallarına uymuyor (eksik alan, yanlış tip, geçersiz değer). * **Çözüm:** * Mobil uygulamada, kullanıcıdan alınan verinin API'nin beklediği JSON yapısına ve veri tiplerine uygun olduğundan emin olun. * API tarafında, gelen veriyi detaylı bir şekilde doğrulayın ve doğrulama hatası durumunda istemciye hangi alanların hatalı olduğunu belirten açıklayıcı bir hata mesajı döndürün. ```json // API'den dönen tipi