Rest API nedir?

REST API (Representational State Transfer Application Programming Interface), uygulama programlama arayüzüdür. REST, web tabanlı sistemler arasında iletişim kurmak için kullanılan bir mimari stilidir. Bir REST API, istemci ve sunucu arasında veri alışverişi yapmak için HTTP protokolünü kullanır.

REST API, web hizmetlerinin ve uygulamaların veri paylaşmasını ve etkileşimde bulunmasını sağlar. İstemci, bir HTTP isteği göndererek sunucuya bir kaynakla (resource) ilişkili işlemler yapmak istediğini belirtir. Sunucu, bu isteği alır, işler ve istemciye bir yanıt döner. Yanıt genellikle JSON veya XML formatında veri içerir.

REST API, bazı temel prensiplere dayanır:

  1. Kaynak Odaklılık (Resource-Oriented): Her kaynak, benzersiz bir tanımlayıcıya (URI – Uniform Resource Identifier) sahip olan bir URL (Uniform Resource Locator) ile temsil edilir. Örneğin, “/users” kaynağı, kullanıcılarla ilgili işlemleri gerçekleştirmek için kullanılabilir.
  2. HTTP Metotları: REST API, HTTP protokolündeki metotları (GET, POST, PUT, DELETE vb.) kullanarak kaynak üzerinde işlemler gerçekleştirir. Örneğin, GET metodu bir kaynağın okunmasını istemek için kullanılırken, POST metodu yeni bir kaynak oluşturmak için kullanılabilir.
  3. Durum Bağımsızlık (Stateless): Sunucu, istemcinin durumunu (state) tutmaz. Her istek, kendisini içeren tüm bilgileri içerir. Bu sayede, birden fazla sunucu örneği kullanılabilir ve yük dengelemesi yapılabilir.
  4. Veri Formatı: Veri genellikle JSON (JavaScript Object Notation) veya XML (eXtensible Markup Language) formatında taşınır. JSON, hafif ve okunabilir bir veri formatıdır ve yaygın olarak tercih edilir.

REST API’ler, web tabanlı uygulamaların, mobil uygulamaların ve diğer sistemlerin birbirleriyle etkileşimde bulunmasını sağlar. Örneğin, bir e-ticaret uygulaması, ürünleri listeleyen, yeni bir ürün ekleyen veya bir ürünü güncelleyen bir REST API kullanabilir.

Rest API ile RESTful API Farklı Mı?

“RESTful API” terimi, REST prensiplerini takip eden bir API’yi ifade eder. Aşağıda, RESTful API’nin özelliklerini ve diğer API türlerinden farklarını açıkladım:

  1. Kaynak Odaklılık: RESTful API, kaynakları benzersiz tanımlayıcılarla (URI) temsil eder. Her kaynak, URL üzerinden erişilebilir olmalıdır. Diğer API türlerinde kaynaklar farklı bir yapıda temsil edilebilir.
  2. Durum Bağımsızlık: RESTful API, sunucu tarafında istemci durumunu tutmaz. Her istek, kendisini içeren tüm bilgileri içerir. Sunucu, her isteği ayrı olarak işler ve yanıt verir. Diğer API türlerinde sunucu bazen istemci durumunu saklayabilir.
  3. HTTP Metotları: RESTful API, HTTP protokolündeki metotları (GET, POST, PUT, DELETE vb.) kullanarak kaynak üzerinde işlemler gerçekleştirir. Diğer API türlerinde bu metotlar kullanılmayabilir veya farklı metotlar kullanılabilir.
  4. Temsiliyet (Representation): Veri, genellikle JSON veya XML formatında taşınır. RESTful API, istemci ve sunucu arasında veri paylaşmak için bu standart veri formatlarını kullanır. Diğer API türlerinde farklı veri formatları kullanılabilir.
  5. HATEOAS (Hypermedia as the Engine of Application State): RESTful API, yanıtlarda bağlantılar (linkler) kullanarak istemciye sunulan kaynaklar arasında geçişleri tanımlar. Bu sayede istemci, API’nin sunabileceği işlemleri dinamik olarak keşfedebilir. Diğer API türlerinde bu bağlantılar genellikle mevcut değildir.

Bu özellikler, RESTful API’nin diğer API türlerinden farkını ortaya koyar. RESTful API, kaynak odaklı, durum bağımsız, standart HTTP metotlarını kullanır, temsil edilen veri formatlarına uyar ve HATEOAS prensibine uyar. Diğer API türleri ise bu prensiplerden farklılık gösterebilir.

Örnek Python Kodu:

#server.py
from flask import Flask, jsonify, request

app = Flask(__name__)

# Örnek veri
books = [
    {"id": 1, "title": "Book 1", "author": "Author 1"},
    {"id": 2, "title": "Book 2", "author": "Author 2"},
]

# Tüm kitapları getiren endpoint
@app.route('/books', methods=['GET'])
def get_books():
    return jsonify(books)

# Belirli bir kitabı getiren endpoint
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    for book in books:
        if book['id'] == book_id:
            return jsonify(book)
    return jsonify({"message": "Book not found"}), 404

# Yeni bir kitap ekleyen endpoint
@app.route('/books', methods=['POST'])
def add_book():
    new_book = {
        "id": request.json['id'],
        "title": request.json['title'],
        "author": request.json['author']
    }
    books.append(new_book)
    return jsonify({"message": "Book added successfully"})

# Bir kitabı güncelleyen endpoint
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    for book in books:
        if book['id'] == book_id:
            book['title'] = request.json['title']
            book['author'] = request.json['author']
            return jsonify({"message": "Book updated successfully"})
    return jsonify({"message": "Book not found"}), 404

# Bir kitabı silen endpoint
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    for book in books:
        if book['id'] == book_id:
            books.remove(book)
            return jsonify({"message": "Book deleted successfully"})
    return jsonify({"message": "Book not found"}), 404

if __name__ == '__main__':
    app.run(debug=True)

#client.py
import requests

# Tüm kitapları getiren endpoint'i test et
def test_get_books():
    response = requests.get('http://localhost:5000/books')
    print(response.json())

# Belirli bir kitabı getiren endpoint'i test et
def test_get_book(book_id):
    response = requests.get(f'http://localhost:5000/books/{book_id}')
    print(response.json())

# Yeni bir kitap ekleyen endpoint'i test et
def test_add_book(book):
    response = requests.post('http://localhost:5000/books', json=book)
    print(response.json())

# Bir kitabı güncelleyen endpoint'i test et
def test_update_book(book_id, book):
    response = requests.put(f'http://localhost:5000/books/{book_id}', json=book)
    print(response.json())

# Bir kitabı silen endpoint'i test et
def test_delete_book(book_id):
    response = requests.delete(f'http://localhost:5000/books/{book_id}')
    print(response.json())

# Testleri çalıştır
if __name__ == '__main__':
    # Tüm kitapları getirme testi
    test_get_books()

    # Belirli bir kitabı getirme testi
    test_get_book(1)

    # Yeni bir kitap ekleme testi
    book = {"id": 3, "title": "Book 3", "author": "Author 3"}
    test_add_book(book)

    # Kitap güncelleme testi
    updated_book = {"title": "Updated Book", "author": "Updated Author"}
    test_update_book(1, updated_book)

    # Kitap silme testi
    test_delete_book(3)

Daha Fazla Detay:

  1. HTTP Durum Kodları: RESTful API’ler, HTTP durum kodlarını kullanarak istemcilere bir işlemin sonucunu bildirir. Örneğin, 200 OK, 201 Created, 404 Not Found, 500 Internal Server Error gibi durum kodları, istemciye yapılan isteğin sonucunu belirtir.
  2. Güvenlik ve Kimlik Doğrulama: RESTful API’lerin güvenliği önemlidir. Kimlik doğrulama ve yetkilendirme için çeşitli yöntemler kullanılabilir. Örneğin, OAuth veya JWT (JSON Web Token) tabanlı kimlik doğrulama mekanizmaları kullanılabilir.
  3. Veri Sıralama ve Filtreleme: API’ler genellikle sıralama veya filtreleme seçenekleri sunar. Bu, istemcinin veriyi belirli bir sıraya göre alma veya belirli kriterlere göre filtreleme imkanı sağlar. Örneğin, “/books?sort=author” gibi bir sıralama veya “/books?author=John” gibi bir filtreleme yapılabilir.
  4. Sayfalama: API’lerin büyük veri kümelelerini yönetmek için sayfalama mekanizmaları kullanılabilir. Bu, büyük bir veri setini küçük parçalara bölerek, istemciye sayfalı sonuçlar döndürmeyi sağlar. Örneğin, “/books?page=1&limit=10” gibi bir sayfalama yapısı kullanılabilir.
  5. Hipermedya Denetimi: HATEOAS (Hypermedia as the Engine of Application State) prensibi, API yanıtlarında bağlantıları (linkler) kullanarak istemciye sunulan kaynaklar arasında geçişleri tanımlar. Bu sayede istemci, API tarafından sunulan işlemleri ve kaynak ilişkilerini dinamik olarak keşfedebilir.
  6. Caching (Önbellekleme): RESTful API’ler, sunucu ve istemci tarafında önbellekleme mekanizmalarını kullanarak performansı artırabilir. HTTP önbellekleme başlıkları (cache headers) ve etag (entity tag) gibi mekanizmalar kullanılabilir.
  7. Hata İşleme: API’lerde hata durumlarının uygun şekilde ele alınması önemlidir. Hataların uygun HTTP durum kodlarıyla birlikte döndürülmesi ve hata mesajlarının bilgilendirici olması gerekmektedir. Hata mesajları genellikle JSON veya XML formatında döndürülür.

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top