Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Merhaba Değerli Ziyaretçimiz, ForumaGel ailesi seni bekliyor! 🌟 Aramıza katılarak güçlü ve samimi topluluğumuzun bir parçası olabilirsin. Burada her üye değerli, her katkı kıymetli. Şimdi üye ol, bizimle birlikte gelişmenin ve keyifli sohbetlerin tadını çıkar! Sevgi ve Saygılarla, ForumaGel Yönetimi ❤️
Yan Yana Banner
Yan Yana Banner
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.
    Biz temelde GET ve POST'a odaklanacağız.
  • İ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"}
        ]
Python'da sözlükler (dict) ve listeler JSON'a kolayca çevrilebilir, Flask'ın `jsonify` fonksiyonu bunu yapar.

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)
Açıklama: `jsonify()` fonksiyonu Python sözlüklerini ve listelerini otomatik olarak JSON formatına çevirir. `/urunler` route'u hem GET (listeleme) hem POST (ekleme) metotlarına izin verir. POST isteği geldiğinde `request.get_json()` ile istek body'sindeki JSON veriyi alırız. Alınan veriyi kontrol edip listeye ekleriz. Başarılı POST isteği için `201 Created` status kodu yaygın kullanılır. Belirli bir ürünü getirirken, bulunamazsa `404 Not Found` status kodu döndürülür.

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.
    ` veya `
    Ziyaretçiler için gizlenmiş link, görmek için kayıt olun. Giriş yap veya üye ol.
    ` gibi adresleri yazarak GET endpoint'lerini test edebilirsiniz. Çıktıyı genellikle JSON formatında göreceksiniz.
  • 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
    Açıklama: `-X POST` metotun POST olduğunu belirtir. `-H "Content-Type: application/json"` gönderdiğimiz verinin JSON olduğunu belirtir. `-d '...'` isteğin body kısmına eklenecek veriyi (JSON formatında) belirtir.
  • 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?
Web API kavramları, REST prensipleri, JSON formatı, HTTP metotlarının API bağlamındaki kullanımı veya Flask ile API endpoint'leri oluşturma hakkında aklınıza takılan soruları çekinmeden bu konu altında sorabilirsiniz.

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?
Geri bildirimleriniz ve önerileriniz serinin geleceğini şekillendirecektir.

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.
 

Şu an konuyu görüntüleyenler

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz

Zevkini yansıtan rengi seç

Geniş / Dar görünüm

Temanızı geniş yada dar olarak kullanmak için kullanabileceğiniz bir yapıyı kontrolünü sağlayabilirsiniz.

Izgara görünümlü forum listesi

Forum listesindeki düzeni ızgara yada sıradan listeleme tarzındaki yapının kontrolünü sağlayabilirsiniz.

Resimli ızgara modu

Izgara forum listesinde resimleri açıp/kapatabileceğiniz yapının kontrolünü sağlayabilirsiniz.

Kenar çubuğunu kapat

Kenar çubuğunu kapatarak forumdaki kalabalık görünümde kurtulabilirsiniz.

Sabit kenar çubuğu

Kenar çubuğunu sabitleyerek daha kullanışlı ve erişiminizi kolaylaştırabilirsiniz.

Köşe kıvrımlarını kapat

Blokların köşelerinde bulunan kıvrımları kapatıp/açarak zevkinize göre kullanabilirsiniz.

Geri