Günümüz dünyasında neredeyse her uygulama, internet üzerinden başka bir servis ile konuşur. Bir hava durumu uygulamasının sunucudan veri çekmesi, bir mobil uygulamanın kullanıcı girişi yapması veya bir veri analiz aracının binlerce dosyayı otomatik indirmesi; tüm bunlar arka planda HTTP (Hypertext Transfer Protocol) protokolü ile gerçekleşir.
Python ekosisteminde bu işlemleri yapmanın en standart, en şık ve en güçlü yolu ise hiç kuşkusuz requests kütüphanesidir. Bu yazıda, temel HTTP isteklerinden başlayarak, profesyonel seviyede API entegrasyonları için gereken ileri teknikleri inceleyeceğiz.
🌐 HTTP Temelleri ve JSON API’ler
Bir web servisiyle iletişime geçmenin en temel yolu GET isteğidir. Modern API’lerin çoğu, verileri JSON formatında iletir. requests kütüphanesi, gelen JSON yanıtlarını tek bir metodla Python sözlüklerine dönüştürerek işimizi inanılmaz kolaylaştırır.
Sadece veri çekmekle kalmayıp, sunucuya veri göndermek (kayıt oluşturmak) için POST, mevcut bir veriyi güncellemek için ise PUT metotlarını kullanırız.
import requests
# Yeni bir post oluşturma (POST)
payload = {"title": "Python Eğitimi", "body": "HTTP öğreniyoruz!", "userId": 1}
response = requests.post("https://jsonplaceholder.typicode.com/posts", json=payload)
if response.status_code == 201:
print("Başarıyla oluşturuldu:", response.json())
⚡ Performans ve Durum Yönetimi: requests.Session
Birçok geliştirici, her istek için requests.get() veya requests.post() fonksiyonlarını ayrı ayrı çağırır. Ancak, aynı sunucuya çok sayıda istek yapıyorsanız bu yöntem verimsizdir; çünkü her çağrı yeni bir TCP bağlantısı kurar.
İşte burada requests.Session devreye girer. Bir oturum nesnesi kullandığınızda:
- Bağlantı Yeniden Kullanımı (Keep-Alive): Aynı TCP bağlantısı üzerinden birden fazla istek gönderilir, bu da hızı ciddi oranda artırır.
- Otomatik Çerez (Cookie) Yönetimi: Sunucudan gelen çerezler oturumda saklanır ve sonraki isteklerde otomatik olarak geri gönderilir (tıpkı bir web tarayıcısı gibi).
- Ortak Başlıklar: Tüm isteklere uygulanacak yetkilendirme tokenları gibi başlıklar bir kez tanımlanır ve her istekte tekrar tekrar yazmanıza gerek kalmaz.
🔐 Güvenli Erişim: Kimlik Doğrulama Yöntemleri
Korumalı API’lere erişmek için farklı kimlik doğrulama (Authentication) yöntemleri kullanılır. Projemizde en yaygın üç kalıbı inceledik:
- Bearer Token: Modern API’lerin (OAuth2, JWT) standartıdır.
Authorization: Bearer <token>başlığıyla gönderilir. - API Key: Daha basit sistemlerde kullanılan, özel bir başlık (örneğin
X-Api-Key) üzerinden iletilen anahtardır. - Basic Auth: Kullanıcı adı ve şifrenin Base64 ile kodlanarak gönderildiği klasik yöntemdir.
requestsbunuauth=('user', 'pass')parametresiyle otomatik halleder.
📦 Büyük Verilerle Çalışmak: Akışlı (Streaming) İndirme
Binlerce sayfalık bir dökümanı veya gigabaytlarca büyüklükteki bir dosyayı indirirken response.content kullanmak, tüm dosyanın belleğe (RAM) yüklenmesine neden olur ve bu da programınızın çökmesine yol açabilir.
Çözüm: stream=True.
Bu parametre ile yanıt gövdesini hemen indirmezsiniz. Bunun yerine iter_content() metodunu kullanarak dosyayı küçük parçalar (chunk) halinde okuyup anında diske yazarsınız. Böylece 10 GB’lık bir dosyayı indirirken RAM kullanımınız sadece birkaç KB seviyesinde kalır.
🛡️ Dayanıklılık: Zaman Aşımı ve Üssel Geri Çekilme (Exponential Backoff)
Üretim ortamında (production) ağ istekleri her zaman başarılı olmaz. Sunucu geçici olarak çökmüş olabilir veya bağlantı yavaşlamış olabilir. Programınızın sonsuza kadar beklemesini engellemek ve sunucuyu daha fazla zorlamadan yeniden denemek için iki strateji kritiktir:
- Timeout: İsteklerin maksimum ne kadar bekleyeceğini belirleyin. Bağlantı ve okuma sürelerini ayrı ayrı tanımlamak (örneğin
timeout=(3, 10)) en sağlıklı yaklaşımdır. - Exponential Backoff (Üssel Geri Çekilme): Bir hata aldığınızda hemen tekrar denemek yerine, bekleme süresini her seferinde ikiye katlayarak artırın (1s $\rightarrow$ 2s $\rightarrow$ 4s $\rightarrow$ 8s…). Bu, sunucunun toparlanmasına izin verir ve “denial-of-service” etkisini önler.
# Basit bir üssel geri çekilme mantığı
delay = 1
for attempt in range(max_retries):
try:
response = requests.get(url, timeout=10)
if response.status_code == 200: break
except:
time.sleep(delay)
delay *= 2 # Bekleme süresini katla
💡 Sonuç
requests kütüphanesi, Python’u internetin gücüyle birleştiren en etkili araçlardan biridir. Temel GET/POST işlemlerinden başlayıp, oturum yönetimi, akışlı indirme ve dayanıklı hata yönetimi stratejilerini eklediğinizde, her türlü web servisiyle profesyonelce iletişim kurabilen araçlar geliştirebilirsiniz.
Ahmet Aksoy
Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.
#python #requests #http #restapi #json #webscraping #apiintegration #backend