- Konu sahibi
- #1
İçeriği JSON olarak döndüren bir API’den veri almak için Python’da HTTP isteği gönderip yanıtın durum kodunu kontrol edebilir, ardından JSON gövdesini Python sözlüğüne veya listesine dönüştürebilirsin. En pratik yöntem
Aşağıdaki örnekte varsayımsal bir API adresinden kullanıcı bilgileri alınır. Adresin gerçekten çalışması için kendi API sağlayıcının dokümantasyonundaki uç nokta adresini kullanmalısın.
Kodu çalıştırdığında API başarılı bir yanıt verirse
API’ler çoğu zaman sonucu değiştiren bilgileri URL parametresi olarak alır. Örneğin arama metnini URL’ye elle eklemek yerine
Bu kod, API’ye
Birçok API, isteği tanımak veya yetkilendirmek için API anahtarı ister. Anahtarın hangi bölümde gönderileceği sağlayıcının dokümantasyonuna bağlıdır. Yaygın yöntemlerden biri
API anahtarını doğrudan kaynak koduna yazmak yerine ortam değişkeninden okumak daha güvenlidir. Örneğin çalıştırmadan önce işletim sisteminde
Başarılı bir HTTP kodu, dönen verinin uygulamanın ihtiyacını karşıladığını tek başına kanıtlamaz. API boş liste, eksik alan veya hata bilgisini 200 koduyla da döndürebilir. Bu nedenle JSON içeriğinde beklediğin alanları kontrol etmelisin.
API’nin hata biçimini dokümantasyondan öğrenmeden yalnızca
API’den veri almak her zaman yalnızca
Aldığın veriyi daha sonra kullanmak istiyorsan JSON olarak dosyaya yazabilirsin. Bu işlem, API’ye her seferinde yeniden istek göndermeden aynı yanıtı incelemene yardımcı olur.
Dosya oluştuğunda içeriği açıp beklenen alanların ve kayıt sayısının doğru olduğunu kontrol et. Dosyaya kaydetmek, verinin güncel olduğu anlamına gelmez; yalnızca o anda alınan yanıtın kopyasını oluşturur. Güncel bilgi gerekiyorsa API’nin önbellekleme, sayfalama ve veri güncelleme kurallarını da dikkate almalısın.
Önce API adresinin, HTTP yönteminin (
Yanıt
En küçük çalışan akış şudur: API dokümantasyonundan doğru uç noktayı ve gerekli bilgileri al, Python’da
requests kütüphanesini kullanmaktır. Önce pip install requests komutuyla kütüphaneyi kur, ardından API adresine GET isteği gönder ve dönen veriyi response.json() ile işle.Basit bir API isteği nasıl gönderilir?
Aşağıdaki örnekte varsayımsal bir API adresinden kullanıcı bilgileri alınır. Adresin gerçekten çalışması için kendi API sağlayıcının dokümantasyonundaki uç nokta adresini kullanmalısın.
Python:
import requests
url = "https://api.example.com/users/1"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
print("Kullanıcı adı:", data["name"])
print("E-posta:", data["email"])
except requests.exceptions.Timeout:
print("API yanıt vermek için gereken süreyi aştı.")
except requests.exceptions.HTTPError as error:
print("HTTP hatası:", error)
except requests.exceptions.RequestException as error:
print("İstek sırasında hata oluştu:", error)
except ValueError:
print("API geçerli bir JSON yanıtı döndürmedi.")
Kodu çalıştırdığında API başarılı bir yanıt verirse
data, JSON içeriğinin Python karşılığı olur. JSON nesnesi genellikle sözlüğe, JSON dizisi ise listeye dönüştürülür. Örneğin API şu yanıtı döndürürse:
JSON:
{
"name": "Ayşe",
"email": "[email protected]"
}
data["name"] ifadesi Ayşe, data["email"] ifadesi ise [email protected] sonucunu verir. Yanıtta bulunmayan bir anahtara doğrudan erişmek KeyError oluşturabileceğinden, isteğe bağlı alanlarda data.get("phone") kullanabilirsin.API adresi ve parametreler nasıl kullanılır?
API’ler çoğu zaman sonucu değiştiren bilgileri URL parametresi olarak alır. Örneğin arama metnini URL’ye elle eklemek yerine
params sözlüğü kullanmak hem daha okunaklıdır hem de özel karakterlerin doğru kodlanmasını sağlar.
Python:
import requests
url = "https://api.example.com/search"
params = {
"q": "Python",
"page": 1,
"limit": 10
}
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
result = response.json()
print(result)
print("Gönderilen adres:", response.url)
Bu kod, API’ye
q, page ve limit parametrelerini gönderir. response.url değeri, isteğin hangi adresle yapıldığını kontrol etmek için kullanılabilir. Sonuç boşsa bu durum isteğin teknik olarak başarısız olduğu anlamına gelmez; arama ölçütüne uygun kayıt bulunmamış olabilir. Böyle bir durumda önce API dokümantasyonundaki parametre adlarını ve beklenen değerleri kontrol etmelisin.API anahtarı nasıl gönderilir?
Birçok API, isteği tanımak veya yetkilendirmek için API anahtarı ister. Anahtarın hangi bölümde gönderileceği sağlayıcının dokümantasyonuna bağlıdır. Yaygın yöntemlerden biri
Authorization başlığıdır.
Python:
import os
import requests
api_key = os.environ["API_KEY"]
url = "https://api.example.com/data"
headers = {
"Authorization": f"Bearer {api_key}",
"Accept": "application/json"
}
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
data = response.json()
print(data)
API anahtarını doğrudan kaynak koduna yazmak yerine ortam değişkeninden okumak daha güvenlidir. Örneğin çalıştırmadan önce işletim sisteminde
API_KEY değişkenini tanımlamalısın. Anahtarın yanlış, eksik veya süresi dolmuş olması genellikle 401 Unauthorized ya da 403 Forbidden yanıtına yol açar. Bu yanıt, Python kodunun JSON’u okuyamadığını değil, API’nin isteği yetkilendirmediğini gösterir; bu durumda anahtarın geçerliliğini, yetkilerini ve dokümantasyonda istenen başlık biçimini kontrol etmelisin.Yanıtın durum kodu nasıl yorumlanır?
response.raise_for_status() başarılı olmayan HTTP durum kodlarında hata oluşturur. Hatanın nedenini anlamak için durum kodunu ayrıca yazdırabilirsin.| Durum kodu | Anlamı | İzlenecek yol |
|---|---|---|
| 200–299 | İstek başarılıdır. | Yanıt gövdesini JSON veya beklenen biçimde işle. |
| 400–499 | İstek veya yetkilendirme ile ilgili sorun vardır. | URL, parametre, başlık ve kimlik doğrulama bilgilerini kontrol et. |
| 500–599 | Sunucu tarafında hata oluşmuştur. | Yanıt gövdesini incele; geçici bir sorunsa daha sonra yeniden dene. |
Python:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
if not data:
print("Yanıt boş geldi.")
elif "error" in data:
print("API hata bildirdi:", data["error"])
else:
print("Veri alındı:", data)
API’nin hata biçimini dokümantasyondan öğrenmeden yalnızca
"error" anahtarını aramak yeterli olmayabilir. Bazı servisler hatayı message, errors veya iç içe başka bir alanla döndürür. Bu nedenle hata yanıtını geçici olarak print(response.text) ile inceleyebilir, hassas bilgileri günlük kaydına yazmamaya dikkat edebilirsin.POST isteğiyle veri gönderip yanıt alma
API’den veri almak her zaman yalnızca
GET isteği anlamına gelmez. Yeni bir kayıt oluştururken veya bir işlem başlatırken API senden JSON gövdesiyle POST isteği bekleyebilir.
Python:
import requests
url = "https://api.example.com/users"
payload = {
"name": "Ayşe",
"email": "[email protected]"
}
headers = {
"Accept": "application/json",
"Content-Type": "application/json"
}
response = requests.post(
url,
json=payload,
headers=headers,
timeout=10
)
response.raise_for_status()
created_user = response.json()
print("Oluşturulan kayıt:", created_user)
json=payload kullanıldığında requests, sözlüğü JSON gövdesine dönüştürür. API’nin beklediği alan adları, veri türleri ve zorunlu alanlar dokümantasyona göre hazırlanmalıdır. Başarılı yanıt genellikle oluşturulan kaydın kimliğini veya işlem sonucunu içerir; bu yanıtı saklayarak sonraki GET, güncelleme veya silme işlemlerinde kullanabilirsin.API yanıtını dosyaya kaydetme
Aldığın veriyi daha sonra kullanmak istiyorsan JSON olarak dosyaya yazabilirsin. Bu işlem, API’ye her seferinde yeniden istek göndermeden aynı yanıtı incelemene yardımcı olur.
Python:
import json
import requests
response = requests.get(
"https://api.example.com/data",
timeout=10
)
response.raise_for_status()
data = response.json()
with open("api_verisi.json", "w", encoding="utf-8") as file:
json.dump(data, file, ensure_ascii=False, indent=2)
print("Veri api_verisi.json dosyasına kaydedildi.")
Dosya oluştuğunda içeriği açıp beklenen alanların ve kayıt sayısının doğru olduğunu kontrol et. Dosyaya kaydetmek, verinin güncel olduğu anlamına gelmez; yalnızca o anda alınan yanıtın kopyasını oluşturur. Güncel bilgi gerekiyorsa API’nin önbellekleme, sayfalama ve veri güncelleme kurallarını da dikkate almalısın.
Çalışmayan istekte hangi bilgiler kontrol edilir?
Önce API adresinin, HTTP yönteminin (
GET, POST gibi), parametre adlarının ve gerekli başlıkların dokümantasyonla aynı olduğunu kontrol et. Ardından response.status_code ve güvenli biçimde response.text değerlerini incele. timeout kullanmak programın yanıt vermeyen bir sunucuyu sınırsız süre beklemesini önler.Yanıt
401 veya 403 ise kimlik doğrulama bilgilerini; 404 ise uç nokta adresini; 400 veya 422 ise gönderilen parametreleri ve JSON alanlarını kontrol et. 429 yanıtı istek sınırına ulaşıldığını gösterebilir; bu durumda art arda istek göndermek yerine API’nin hız sınırı ve yeniden deneme kurallarına uygun hareket etmelisin. 5xx yanıtlarında sorun sunucu tarafında olabilir, ancak hatalı istek biçimi veya geçersiz bir sunucu yapılandırması da aynı sonucu doğurabileceği için yanıt gövdesindeki açıklamayı incelemek gerekir.En küçük çalışan akış şudur: API dokümantasyonundan doğru uç noktayı ve gerekli bilgileri al, Python’da
requests.get() veya requests.post() ile isteği gönder, durum kodunu kontrol et, response.json() ile yanıtı dönüştür, beklenen alanları doğrula ve gerekiyorsa sonucu dosyaya kaydet. Böylece yalnızca API’den yanıt almış olmaz, aldığın verinin gerçekten kullanılabilir olup olmadığını da kontrol etmiş olursun.