Python İle Requests Kütüphanesi Kullanarak Rest Api İstek Yönetimi Nasıl Yapılır?

Python İle Requests Kütüphanesi Kullanarak Rest Api İstek Yönetimi Nasıl Yapılır?
Python İle Requests Kütüphanesi Kullanarak Rest Api İstek Yönetimi Nasıl Yapılır?

Ön Hazırlık ve Ortam Kurulumu

Çalışmaya başlamadan önce bilgisayarınızda Python'un güncel bir sürümünün (3.10 ve üzeri önerilir) kurulu olması gerekir. requests kütüphanesi Python'un standart kütüphanesinde yer almaz, bu yüzden paket yöneticisi olan pip aracılığıyla kurulum yapmalısınız.

pip install requests

Kurulumun başarılı olup olmadığını kontrol etmek için terminal veya komut istemcinizde python -c "import requests; print(requests.__version__)" komutunu çalıştırabilirsiniz. Eğer bir sürüm numarası görüyorsanız, ortamınız hazır demektir. Ayrıca, API isteklerini test etmek için ücretsiz ve güvenilir bir servis olan JSONPlaceholder kullanacağız.

Temel GET İsteği ve Yanıt Okuma

REST API dünyasında en sık kullanılan yöntem GET isteğidir. Bir sunucudan veri çekmek için kullanılır. Aşağıdaki örnekte, örnek bir API'den kullanıcı verilerini nasıl çekeceğimizi göreceksiniz.

import requests

url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)

if response.status_code == 200:
    data = response.json()
    print(f"Başlık: {data['title']}")
else:
    print(f"Hata oluştu: {response.status_code}")

Burada requests.get() fonksiyonu ile sunucuya bir talep gönderiyoruz. response.json() metodu, sunucudan gelen JSON formatındaki veriyi Python sözlüğüne (dictionary) dönüştürür. status_code kontrolü yapmak, isteğin başarılı olup olmadığını anlamak için hayati önem taşır.

POST İsteği İle Veri Gönderme

Sunucuya yeni bir veri eklemek veya mevcut bir veriyi güncellemek istediğimizde POST yöntemini kullanırız. json parametresi, veriyi otomatik olarak JSON formatında paketleyerek gönderir.

import requests

url = "https://jsonplaceholder.typicode.com/posts"
payload = {
    "title": "Yeni Makale",
    "body": "Python ile API yönetimi öğreniyorum.",
    "userId": 1
}

response = requests.post(url, json=payload)

print(f"Sunucu Yanıtı: {response.status_code}")
print(f"Gönderilen Veri: {response.json()}")

Bu kod bloğunda json=payload kullanımı, Content-Type başlığının otomatik olarak application/json olarak ayarlanmasını sağlar. Bu, modern REST API'lerin beklediği standart formattır.

API İsteklerinde Hata Yönetimi ve Güvenlik

Gerçek dünya projelerinde ağ hataları, zaman aşımları (timeout) veya sunucu hataları kaçınılmazdır. İsteklerinizi try-except blokları ile sarmalamak, uygulamanızın çökmesini engeller.

import requests
from requests.exceptions import HTTPError, Timeout

url = "https://jsonplaceholder.typicode.com/posts/1"

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status() # Hata kodu varsa exception fırlatır
    print(response.json())
except HTTPError as http_err:
    print(f"HTTP hatası: {http_err}")
except Timeout:
    print("İstek zaman aşımına uğradı.")
except Exception as err:
    print(f"Beklenmedik bir hata: {err}")
Kritik Güvenlik Uyarısı: API anahtarlarınızı (API Keys) asla kodunuzun içine doğrudan yazmayın. Bunun yerine .env dosyaları ve python-dotenv kütüphanesini kullanarak çevresel değişkenler (environment variables) ile yönetin. Ayrıca, hassas verileri gönderirken mutlaka HTTPS protokolünü kullanın.

İstek Yöntemleri Karşılaştırma Tablosu

Yöntem Kullanım Amacı Avantajı Dezavantajı
GET Veri Çekme Hızlı ve cache'lenebilir Hassas veri gönderilmez
POST Veri Oluşturma Güvenli veri iletimi Cache'lenemez
PUT Tam Güncelleme Veriyi tamamen değiştirir Tüm nesneyi göndermek gerekir
DELETE Veri Silme Basit ve net Geri dönüşü yoktur

Header ve Parametre Kullanımı

API'ler genellikle kimlik doğrulama veya içerik tipi belirleme için headers (başlıklar) bekler. Ayrıca, URL sonuna eklenen sorgu parametrelerini (query parameters) elle yazmak yerine params sözlüğünü kullanmak çok daha güvenlidir.

import requests

headers = {"Authorization": "Bearer TOKEN_BURAYA"}
params = {"userId": 1}

response = requests.get("https://jsonplaceholder.typicode.com/posts", headers=headers, params=params)
print(response.url) # URL'nin nasıl oluştuğunu kontrol edin

params kullanımı, özel karakterlerin otomatik olarak URL-encoded (URL uyumlu) hale getirilmesini sağlar. Bu, hata payını minimize eden bir yöntemdir.

Session Kullanımı İle Performans Artırma

Eğer aynı sunucuya çok sayıda istek atmanız gerekiyorsa, her istekte yeni bir bağlantı kurmak yerine requests.Session() kullanmak performansı ciddi oranda artırır. Bu yöntem, bağlantı havuzunu (connection pooling) yeniden kullanır.

import requests

session = requests.Session()
session.headers.update({"User-Agent": "My-App/1.0"})

# Aynı session üzerinden birden fazla istek
for i in range(1, 4):
    response = session.get(f"https://jsonplaceholder.typicode.com/posts/{i}")
    print(f"İstek {i}: {response.status_code}")
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamındaki (production) uygulamalarınızda, veri güvenliği ve API sağlayıcınızın kullanım politikalarına (rate limiting vb.) uygun hareket etmek tamamen geliştiricinin sorumluluğundadır.

Sıkça Sorulan Sorular

API isteği atarken timeout neden önemlidir?

Sunucu yanıt vermediğinde veya ağ bağlantısı koptuğunda uygulamanızın sonsuza kadar beklememesi için timeout parametresi kritik bir güvenlik önlemidir.

JSON verisi nasıl Python nesnesine dönüştürülür?

response.json() metodu, JSON verisini otomatik olarak Python sözlüklerine veya listelerine dönüştürür.

Requests kütüphanesi asenkron mudur?

Hayır, requests senkron (blocking) bir kütüphanedir. Eğer asenkron bir yapıya ihtiyacınız varsa httpx veya aiohttp kütüphanelerini inceleyebilirsiniz.

Status code 403 ne anlama gelir?

403 Forbidden hatası, sunucuya erişim izninizin olmadığını veya kimlik doğrulama bilgilerinizin hatalı olduğunu gösterir.

API'den gelen veriyi nasıl dosyaya kaydederim?

response.json() ile aldığınız veriyi json.dump() kullanarak yerel bir dosyaya yazabilirsiniz.

API İsteklerinde Hata Ayıklama ve Logging Stratejileri

Geliştirme sürecinde, API'den dönen yanıtların neden beklediğiniz gibi olmadığını anlamak için sadece status_code kontrolü yeterli olmayabilir. Requests kütüphanesi ile çalışırken, isteklerin detaylı bir dökümünü almak, özellikle karmaşık kimlik doğrulama süreçlerinde hayat kurtarıcıdır.

Python'un yerleşik logging modülünü kullanarak, HTTP trafiğini detaylı bir şekilde izleyebilirsiniz. Bu yöntem, hata ayıklama (debugging) sürecini hızlandırır ve üretim ortamında oluşabilecek sorunları önceden tespit etmenizi sağlar.

import logging
import requests
import http.client

# HTTP trafiğini konsola yansıtalım
http.client.HTTPConnection.debuglevel = 1

logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

response = requests.get("https://api.github.com")

İstekleri Mocking ile Test Etme

Gerçek API servislerine sürekli istek atmak, hem hızınızı düşürür hem de API limitlerine (rate limit) takılmanıza neden olabilir. Birim testleri (unit tests) yazarken responses gibi kütüphaneler kullanarak, ağ isteği yapmadan API yanıtlarını taklit edebilirsiniz.

import requests
import responses

@responses.activate
def test_api_call():
    responses.add(
        responses.GET, 
        'https://api.test.com/data',
        json={'status': 'success', 'data': 123}, 
        status=200
    )

    resp = requests.get('https://api.test.com/data')
    assert resp.json()['data'] == 123
    assert resp.status_code == 200

İleri Seviye Performans İpuçları: Akış (Streaming) Kullanımı

Büyük boyutlu verilerle (örneğin büyük bir JSON dosyası veya medya içeriği) çalışırken, verinin tamamını belleğe (RAM) yüklemek uygulamanızın çökmesine neden olabilir. stream=True parametresini kullanarak veriyi parçalar halinde okuyabilirsiniz.

Bu yöntem, özellikle büyük dosyaları indirirken veya sürekli veri akışı sağlayan API'lerle çalışırken bellek kullanımını minimize eder.

url = 'https://api.ornek.com/buyuk-veri.json'

with requests.get(url, stream=True) as r:
    r.raise_for_status()
    with open('veri.json', 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            if chunk:
                f.write(chunk)

Neden stream=True Kullanmalısınız?

  • Düşük Bellek Tüketimi: Veri parçalar halinde işlendiği için RAM kullanımı sabit kalır.
  • Daha Hızlı Başlangıç: Verinin tamamının indirilmesini beklemeden işleme başlayabilirsiniz.
  • Kesintisiz Bağlantı: İndirme işlemi sırasında bağlantı kopsa bile, hangi parçada kaldığınızı yönetmek daha kolaydır.

Bu teknikleri projenize entegre ederek, API etkileşimlerinizi daha dayanıklı, test edilebilir ve yüksek performanslı hale getirebilirsiniz. Özellikle üretim ortamına geçmeden önce logging ve mocking süreçlerini otomatize etmek, uzun vadede bakım maliyetlerinizi ciddi oranda düşürecektir.

Sonuç

Python ile requests kütüphanesini kullanarak REST API yönetimi yapmak, ölçeklenebilir ve profesyonel uygulamalar geliştirmenin temel taşıdır. Bu rehberde GET ve POST isteklerinden hata yönetimine, session kullanımından güvenlik pratiklerine kadar geniş bir yelpazeyi ele aldık. Bir sonraki adım olarak, kendi API anahtarınızı kullanarak gerçek bir servise (örneğin OpenWeatherMap veya GitHub API) bağlanmayı deneyebilir ve çektiğiniz verileri veritabanına kaydetme üzerine pratik yapabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz