API Yanıtlarını ve Hatalarını Ele Alma
JSON yanıtlarını ayrıştırma, hata kodları ve özel durum işleme kalıpları.
API Yanıtlarını ve Hatalarını Ele Alma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Yanıt Nesnesi
Her requests çağrısı bir Yanıt nesnesi döndürür. Bu nesne, sunucunun geri gönderdiği her şeyi içerir: durum kodunu, üstbilgileri ve gövdeyi. Gövdeyi işlemeden önce her zaman durum kodunu inceleyin; 500 durum koduna sahip bir yanıtın yine de gövdesi olabilir, ancak bu gövde aradığınız verileri içermez.
import requests
response = requests.get('https://api.example.com/data')
# Key attributes of the response
print(response.status_code) # e.g. 200
print(response.headers) # dict of response headers
print(response.headers.get('Content-Type')) # 'application/json'
print(response.text) # raw response body as string
print(response.content) # raw bytesresponse.json() ile JSON Ayrıştırma
Yanıt gövdesini Python sözlüğü veya listesi olarak JSON biçiminde otomatik şekilde ayrıştırmak için response.json() çağrısını yapın. Bu, json.loads(response.text) ile eşdeğerdir; ancak Content-Type değerinin uygun olduğunu da doğrular.
Yalnızca yanıtın gerçekten JSON olduğunu bildiğinizde .json() çağrısını yapın; önce Content-Type üstbilgisini kontrol edin.
import requests
response = requests.get(
'https://api.example.com/users/42',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
# Parse JSON body
user = response.json()
# Access fields safely with .get()
name = user.get('name', 'Unknown')
email = user.get('email', '')
roles = user.get('roles', [])
print(f'User: {name} ({email})')
print(f'Roles: {roles}')Ayrıştırmadan Önce status_code Değerini Kontrol Etme
İsteğin başarılı olduğunu doğrulamadan asla response.json() çağrısını yapmayın. Hata yanıtları (4xx/5xx) genellikle hata ayrıntılarını JSON biçiminde döndürür; bunlar hata ayıklama için yararlı olsa da ihtiyacınız olan veriler değildir. Önce her zaman status_code değerini kontrol edin.
import requests
response = requests.post(
'https://api.example.com/tasks',
json={'title': 'Write report'},
headers={'Authorization': 'Bearer YOUR_KEY'}
)
if response.status_code == 201:
task = response.json()
print('Task created, ID:', task['id'])
elif response.status_code == 400:
error = response.json()
print('Validation error:', error.get('message'))
elif response.status_code == 401:
print('Auth failed — check your token')
else:
print(f'Unexpected status {response.status_code}: {response.text[:200]}')raise_for_status() — Otomatik Hata Oluşturma
Durum kodu 4xx veya 5xx ise response.raise_for_status() otomatik olarak bir HTTPError istisnası oluşturur. Bu, hatalı HTTP yanıtlarını Python istisnalarına dönüştürmenin temiz bir yoludur; uzun if/elif zincirleri yerine try/except kullanmanızı sağlar.
import requests
from requests.exceptions import HTTPError
try:
response = requests.get(
'https://api.example.com/users/9999',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
response.raise_for_status() # raises if status >= 400
user = response.json()
print('Found user:', user['name'])
except HTTPError as e:
print(f'HTTP error: {e.response.status_code}')
print('Details:', e.response.text[:300])JSONDecodeError İşleme
Bazen bir API, JSON beklediğiniz halde JSON olmayan bir yanıt döndürür: HTML biçiminde bir sunucu hata sayfası, boş bir gövde veya ikili bir dosya. Bu yanıtlar üzerinde response.json() çağrısı yapmak json.JSONDecodeError oluşturur. Aracının sessizce çökmesini önlemek için bu durumu her zaman yakalayın.
import requests
import json
response = requests.get(
'https://api.example.com/report',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
try:
data = response.json()
except json.JSONDecodeError as e:
print(f'Response is not valid JSON: {e}')
print('Content-Type:', response.headers.get('Content-Type'))
print('First 200 chars:', response.text[:200])
# Decide: is this an HTML error page? A CSV file?
data = None
if data is None:
print('Falling back to text processing')ConnectionError — Ağ Sorunları
ConnectionError, aracınız sunucuya hiç ulaşamadığında meydana gelir: DNS çözümleme hatası, sunucunun çevrimdışı olması veya güvenlik duvarının isteği engellemesi gibi. Bu, herhangi bir HTTP işlemi gerçekleşmeden önce ortaya çıkan ağ düzeyinde bir hatadır.
5xx yanıtından farklı olarak bu, sunucunun yanıtı değildir; bağlantı hiç kurulmamıştır.
import requests
from requests.exceptions import ConnectionError
try:
response = requests.get('https://api.example.com/data')
data = response.json()
except ConnectionError as e:
print('Cannot reach server. Possible causes:')
print('- DNS failure (bad hostname)')
print('- Server is down')
print('- No internet connection')
print('- Firewall blocking the port')
print(f'Error detail: {e}')
# Consider: queue the request for retry when connectivity returnsZaman Aşımı — Takılıp Kalan Aracı Önleme
Varsayılan olarak requests, bir yanıt için sonsuza kadar bekler. Yavaşlayan veya yanıt vermeyi bırakan bir sunucu, aracınızı süresiz olarak dondurur. Her zaman bir zaman aşımı belirleyin: saniye cinsinden (connect_timeout, read_timeout) ikilisi kullanın. Sunucu zamanında yanıt vermezse Timeout istisnası oluşturulur.
import requests
from requests.exceptions import Timeout
try:
response = requests.get(
'https://api.example.com/slow-endpoint',
headers={'Authorization': 'Bearer YOUR_KEY'},
timeout=(5, 30) # 5s to connect, 30s to read
)
data = response.json()
except Timeout:
print('Request timed out after 30 seconds')
print('Options: retry, use cached result, or alert operator')Kapsamlı İstisna İşleme
Üretim ortamındaki aracılarda tüm requests istisnalarını tutarlı bir hiyerarşi içinde yakalayın. requests.exceptions.RequestException, tüm requests hatalarının temel sınıfıdır; bunu yakalamak beklenmeyen ağ sorunlarına karşı bir güvenlik ağı sağlar.
import requests
import json
from requests.exceptions import (
ConnectionError, Timeout, HTTPError, RequestException
)
def safe_api_call(url, headers):
try:
r = requests.get(url, headers=headers, timeout=(5, 30))
r.raise_for_status()
return r.json()
except Timeout:
print('ERROR: Request timed out')
except ConnectionError:
print('ERROR: Cannot reach server')
except HTTPError as e:
print(f'ERROR: HTTP {e.response.status_code}')
try:
print('API error:', e.response.json().get('message'))
except json.JSONDecodeError:
print('Non-JSON error body')
except RequestException as e:
print(f'ERROR: Unexpected request error: {e}')
return NoneHata Ayıklama İçin Yanıtları Günlüğe Kaydetme
Bir aracı hatalı davrandığında, sorunu teşhis etmek için yeterli bağlama ihtiyacınız olur. İstek yöntemini, URL'yi, durum kodunu ve ilgili yanıt ayrıntılarını günlüğe kaydedin; ancak API anahtarlarını asla günlüğe kaydetmeyin. Üretim ortamındaki aracılar için print ifadeleri yerine Python'un yerleşik logging modülünü kullanın.
import logging
import requests
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('agent.api')
def logged_request(method, url, **kwargs):
logger.info(f'-> {method.upper()} {url}')
response = requests.request(method, url, **kwargs)
logger.info(
f'<- {response.status_code} '
f'({len(response.content)} bytes) '
f'{response.elapsed.total_seconds():.2f}s'
)
if response.status_code >= 400:
logger.error(f'Error body: {response.text[:500]}')
return responseSayfalandırılmış Yanıtları Ele Alma
Birçok API verileri sayfalar halinde döndürür. Tüm sonuçları almak için aracınız sayfalandırma bağlantılarını izlemelidir. Yanıtta bir next URL'si veya page/cursor alanı arayın ve başka sayfa kalmayana kadar döngüyü sürdürün.
import requests
def get_all_items(base_url, headers):
all_items = []
url = f'{base_url}/items?page=1&limit=100'
while url:
response = requests.get(url, headers=headers)
response.raise_for_status()
data = response.json()
all_items.extend(data.get('items', []))
# Follow 'next' link if present
url = data.get('next_page_url') # None stops the loop
print(f'Fetched {len(all_items)} items so far...')
print(f'Total: {len(all_items)} items')
return all_itemsBüyük Yanıtları Akışla İşleme
Büyük yanıtlar (dosyalar, uzun yapay zekâ çıktıları) için yanıtın tamamını tek seferde belleğe yüklemekten kaçınmak amacıyla stream=True kullanın. Yanıtı parçalar halinde okuyun. Bu, aracınız büyük veri kümelerini işlerken veya yapay zekâ tarafından oluşturulan metni akış halinde sunarken zorunludur.
import requests
response = requests.get(
'https://api.example.com/large-report',
headers={'Authorization': 'Bearer YOUR_KEY'},
stream=True
)
response.raise_for_status()
# Write streamed content to file
with open('report.json', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print('Download complete')
# For streaming JSON lines (NDJSON):
for line in response.iter_lines():
if line:
import json
record = json.loads(line)
print(record)Kısa Kontrol: raise_for_status
Yanıt hatalarını ele alma konusundaki anlayışınızı sınayın.
Yanıt İşleme Özeti
Dayanıklı yanıt işleme, kırılgan bir aracı güvenilir bir aracından ayıran özelliktir:
- Gövdeyi ayrıştırmadan önce her zaman
status_codedeğerini kontrol edin - Ayrıştırma için
response.json()kullanın; gövde JSON olmayabilirseJSONDecodeErroryakalayın - HTTP hatalarını istisnalara dönüştürmek için
raise_for_status()kullanın - Ağ hataları için
ConnectionError, yavaş sunucular içinTimeoutyakalayın - Her istekte daima bir
timeout=(connect, read)ikilisi belirleyin - Hata ayıklanabilirlik için istekleri ve yanıtları anahtarlar olmadan günlüğe kaydedin
Sıkça Sorulan Sorular
“API Yanıtlarını ve Hatalarını Ele Alma” dersi ücretsiz mi?
Evet — “API Yanıtlarını ve Hatalarını Ele Alma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“API Yanıtlarını ve Hatalarını Ele Alma” dersinde ne öğreneceğim?
JSON yanıtlarını ayrıştırma, hata kodları ve özel durum işleme kalıpları. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“API Yanıtlarını ve Hatalarını Ele Alma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Aracı Geliştiricileri İçin REST API Temelleri
- Kimlik Doğrulama: API Anahtarları ve OAuth
- API Yanıtlarını ve Hatalarını Ele Alma
- Hız Sınırlama ve Yeniden Deneme Mantığı