- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Hazır Kod Bankası - Konu 22: Web API (REST API) Temelleri ve Flask ile Basit API
Hazır Kod Bankası Serimizin Yirmi İkinci Konusu: Web API (REST API) Temelleri!
Merhaba arkadaşlar! Günümüz yazılım ekosisteminde, farklı sistemlerin (mobil uygulamalar, web siteleri, masaüstü yazılımlar, hatta diğer sunucular) birbiriyle veri ve işlevsellik paylaşması hayati önem taşır. Bu iletişim, genellikle API'ler (Application Programming Interface - Uygulama Programlama Arayüzü) aracılığıyla kurulur. API, bir yazılımın başka bir yazılımın belirli işlevlerini veya verilerini kullanmasına olanak tanıyan bir arayüzdür.
Özellikle web tabanlı uygulamalar için yaygın olan API türü Web API'lerdir. Web API'ler, HTTP protokolü üzerinden erişilir ve genellikle veri transferi için JSON (JavaScript Object Notation) formatını kullanır. Web API mimari stillerinden en popüler ve yaygın olanı ise REST (Representational State Transfer)'tir.
Bu konuda, Web API'lerin ne olduğunu, REST prensiplerini (basit düzeyde), JSON formatını ve Python Flask framework'ünü kullanarak dış uygulamaların erişebileceği basit API uç noktaları (endpoint) nasıl oluşturacağımızı göreceğiz.
1. API Nedir? Web API Nedir? Neden Önemlidir?
- API (Uygulama Programlama Arayüzü): İki yazılım sisteminin birbiriyle etkileşim kurmasını sağlayan kurallar ve tanımlar bütünüdür. Bir kütüphanedeki fonksiyonlar, bir işletim sisteminin servisleri de birer API'dir.
- Web API: HTTP protokolü üzerinden internet üzerinden erişilebilen API'lerdir. Sunucudaki belirli kaynaklara (verilere veya işlevlere) ulaşmak için kullanılırlar. Mobil uygulamalar, tek sayfa uygulamalar (SPA), mikroservisler ve hatta farklı web siteleri arasındaki iletişim Web API'leri aracılığıyla sağlanır.
- Önemi: Farklı platformlardaki uygulamaların aynı backend'i kullanmasına olanak tanır, sistemler arası entegrasyonu kolaylaştırır, modüler ve esnek yazılım mimarileri kurulmasını sağlar.
2. REST (Representational State Transfer) Nedir?
REST, bir mimari stilidir, bir standart veya protokol değildir. Web API'leri tasarlarken uyulması önerilen prensipler bütünüdür. RESTful API'ler şu özelliklere sahip olmayı hedefler:
- Kaynak Tabanlı: Her şey bir kaynaktır (Resource - örn: /users, /products/1). Kaynaklara URI (URL) ile erişilir.
- Durumsuz (Stateless): Sunucu, her isteği birbirinden bağımsız değerlendirir. İki istek arasında sunucuda kullanıcıya ait durum bilgisi tutulmaz (durum bilgisi genellikle istemcide veya veritabanında yönetilir).
- Standart Metotlar: HTTP metotları (fiilleri) kullanılır:
- GET: Kaynağı veya kaynak koleksiyonunu okumak için. (Veri göndermez, sadece alır)
- POST: Yeni bir kaynak oluşturmak veya bir kaynağa veri göndermek için. (Veri body kısmında gönderilir)
- PUT: Bir kaynağı güncellemek için (genellikle kaynağın tamamını değiştirir).
- PATCH: Bir kaynağın bir kısmını güncellemek için.
- DELETE: Bir kaynağı silmek için.
- İstemci-Sunucu Ayrımı: Ön yüz (istemci) ve arka yüz (sunucu) birbirinden bağımsız geliştirilebilir.
- Katmanlı Sistem: Sistem farklı katmanlardan oluşabilir (API Gateway, önbellek, yük dengeleyici vb.).
3. JSON (JavaScript Object Notation) Nedir?
JSON, Web API'lerde veri alışverişi için en yaygın kullanılan veri formatıdır. İnsanlar tarafından kolayca okunabilir ve yazılabilir, makineler tarafından kolayca ayrıştırılabilir (parse edilebilir). JavaScript'teki obje ve dizi sözdizimine benzer.
JSON Temel Yapıları:
- Objeler: Süslü parantezler `{}` ile tanımlanır. Anahtar-değer çiftlerinden oluşur. Anahtarlar string, değerler ise string, sayı, boolean, null, başka bir obje veya dizi olabilir. Anahtar ve değer iki nokta üst üste `:` ile, çiftler virgül `,` ile ayrılır.
JSON:{ "urunAdi": "Laptop", "fiyat": 15000, "stoktaVar": true, "ozellikler": { "ram": "16GB", "depolama": "512GB SSD" }, "etiketler": ["elektronik", "bilgisayar"] }
- Diziler (Arrays): Köşeli parantezler `[]` ile tanımlanır. Sıralı elemanlar listesidir. Elemanlar virgül `,` ile ayrılır ve farklı tiplerde olabilirler (sayı, string, boolean, obje, dizi vb.).
JSON:[ {"id": 1, "isim": "Ali"}, {"id": 2, "isim": "Veli"}, {"id": 3, "isim": "Ayşe"} ]
4. Flask ile Basit Bir REST API Oluşturma[/B]
Şimdi Python Flask kullanarak, basit bir ürün listesini yöneten (okuma ve ekleme) bir API oluşturalım. Verilerimizi şimdilik geçici olarak bir Python listesi içinde saklayacağız (veritabanı entegrasyonunu bir sonraki seviyede yapabiliriz).
Python:
# app_api.py dosyası
from flask import Flask, jsonify, request # jsonify ve request içe aktar
app = Flask(__name__)
# Geçici veri kaynağı (bir Python listesi içinde sözlükler)
# Gerçek uygulamada burası veritabanı erişimi olurdu
urunler = [
{'id': 1, 'ad': 'Laptop', 'fiyat': 15000},
{'id': 2, 'ad': 'Klavye', 'fiyat': 500},
{'id': 3, 'ad': 'Fare', 'fiyat': 200}
]
# Tüm ürünleri listeleme endpoint'i (GET /urunler)
@app.route('/urunler', methods=['GET'])
def get_urunler():
# Python listesini JSON formatına çevir ve yanıt olarak döndür
return jsonify(urunler)
# Belirli bir ürünü ID'sine göre getirme endpoint'i (GET /urunler/<id>)
@app.route('/urunler/<int:urun_id>', methods=['GET']) # URL'den integer ID al
def get_urun(urun_id):
# Ürün listesinde ID'ye göre ürünü ara
for urun in urunler:
if urun['id'] == urun_id:
return jsonify(urun) # Bulunan ürünü JSON olarak döndür
# Ürün bulunamazsa hata yanıtı döndür
# Flask otomatik olarak 404 status code'unu ayarlar
return jsonify({'mesaj': 'Ürün bulunamadı'}), 404 # Mesaj ve status kodunu döndür
# Yeni ürün ekleme endpoint'i (POST /urunler)
@app.route('/urunler', methods=['POST'])
def add_urun():
# Gelen isteğin body'sindeki JSON veriyi al
# İstek 'Content-Type: application/json' olmalı
yeni_urun = request.get_json()
# Gelen verinin geçerliliğini kontrol et (basit kontrol)
if not yeni_urun or not 'ad' in yeni_urun or not 'fiyat' in yeni_urun:
# Geçersiz veri formatı ise hata döndür
return jsonify({'mesaj': 'Geçersiz veri formatı'}), 400 # 400 Bad Request
# Yeni ürüne bir ID ata (Basit ID atama, gerçekte DB handle eder)
yeni_id = urunler[-1]['id'] + 1 if urunler else 1 # Eğer liste boş değilse son elemanın ID'sinin 1 fazlası
# Yeni ürünü oluştur
urun = {'id': yeni_id, 'ad': yeni_urun['ad'], 'fiyat': yeni_urun['fiyat']}
# Ürün listesine ekle
urunler.append(urun)
# Yeni oluşturulan ürünü JSON olarak başarı mesajı ile döndür
return jsonify({'mesaj': 'Ürün başarıyla eklendi', 'urun': urun}), 201 # 201 Created status code
# Uygulamayı çalıştırma
if __name__ == '__main__':
app.run(debug=True)
5. API Test Etme[/B]
Yazdığınız API endpoint'lerini test etmek için farklı araçlar kullanabilirsiniz:
- Tarayıcı: Sadece GET istekleri için kullanışlıdır. Tarayıcının adres çubuğuna `
Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
- Curl Komutu: Komut satırı aracıdır, tüm HTTP metotlarını (GET, POST vb.) test etmek için kullanılır. Windows, macOS, Linux'ta mevcuttur.
Kod:# Tüm ürünleri GET isteği ile al curl http://127.0.0.1:5000/urunler # ID'si 2 olan ürünü GET isteği ile al curl http://127.0.0.1:5000/urunler/2 # Yeni ürün ekleme (POST isteği ile, JSON data göndererek) curl -X POST -H "Content-Type: application/json" -d "{\"ad\": \"Monitor\", \"fiyat\": 3000}" http://127.0.0.1:5000/urunler
- Postman / Insomnia: API test etmek için özel olarak tasarlanmış grafik arayüzlü (GUI) popüler araçlardır. Farklı metotlarla kolayca istek göndermenizi, header'ları ayarlamanızı ve yanıtları görmenizi sağlarlar. Gerçek API geliştirme süreçlerinde yaygın kullanılırlar.
Sıra Sizde!
Web API temellerini ve Flask ile basit bir API oluşturmayı gördük.
- Yukarıdaki `app_api.py` kodunu yazıp çalıştırdınız mı?
- Tarayıcıyı kullanarak `/urunler` ve `/urunler/ID` (örneğin `/urunler/1`) adreslerine giderek GET endpoint'lerini test ettiniz mi? Çıktıyı incelediniz mi?
- Curl komutunu veya Postman/Insomnia gibi bir aracı kullanarak `/urunler` adresine bir POST isteği göndererek (örnekteki JSON formatında veri ile) yeni bir ürün eklemeyi denediniz mi? Ekledikten sonra `/urunler` adresine GET isteği yaparak yeni ürünün listede göründüğünü kontrol ettiniz mi?
- ID'si olmayan bir ürünü (`/urunler/999`) GET isteği ile isteyerek 404 hatasını görmeyi denediniz mi?
- POST isteğinde geçerli olmayan veri (eksik 'ad' veya 'fiyat' gibi) göndererek 400 hatasını görmeyi denediniz mi?
Serinin Geleceği?
API'ler modern yazılımın temel yapı taşlarındandır. Flask ile basit bir REST API oluşturarak bu önemli konuya giriş yaptık.
Seriyi buradan sonra nasıl devam ettirelim?
- Bu API'yi veritabanına bağlama (Flask-SQLAlchemy kullanarak Konu 21'deki bilgiyi API ile birleştirme)?
- REST API'de PUT ve DELETE metotlarını uygulama?
- API güvenliği temelleri (Kimlik doğrulama - Authentication, Yetkilendirme - Authorization)?
- Başka API Framework'lerine giriş (Flask-RESTful/RESTX, Django REST Framework, Node.js Express)?
- Client-side JavaScript kullanarak bu API'yi tüketme (Fetch API, AJAX)?
- Daha ileri Veri Yapıları ve Algoritmalar (Bağlı Listeler, Ağaçlar vb.)?
- Başka bir programlama diline giriş (C#, C++ gibi)?
- Mobil geliştirme temelleri?
- Veya başka önerileriniz mi var?
Umarım bu konu, farklı sistemlerin nasıl iletişim kurduğu hakkında sizlere yeni bir bakış açısı sunmuştur. Görüşmek üzere!
Bu konu, "Hazır Kod Bankası" serisinin yirmi ikinci parçasıdır ve "Yazılım Bilgi ve Yeni Başlayanlar İçin" kategorisi altında paylaşılmıştır.