0Pricing
AI Agents · Ders

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 bytes

response.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 returns

Zaman 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 None

Hata 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 response

Sayfalandı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_items

Bü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_code değerini kontrol edin
  • Ayrıştırma için response.json() kullanın; gövde JSON olmayabilirse JSONDecodeError yakalayın
  • HTTP hatalarını istisnalara dönüştürmek için raise_for_status() kullanın
  • Ağ hataları için ConnectionError, yavaş sunucular için Timeout yakalayı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

  1. Aracı Geliştiricileri İçin REST API Temelleri
  2. Kimlik Doğrulama: API Anahtarları ve OAuth
  3. API Yanıtlarını ve Hatalarını Ele Alma
  4. Hız Sınırlama ve Yeniden Deneme Mantığı
← AI Agents Sayfasına Dön