0Pricing
AI Agents · Pelajaran

Menangani Respons dan Error API

Mengurai respons JSON, kode error, dan pola penanganan pengecualian.

Menangani Respons dan Error API adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.

Objek Respons

Setiap panggilan requests mengembalikan objek respons. Objek ini berisi semua yang dikirimkan kembali oleh server: kode status, header, dan isi. Sebelum memproses isi, selalu periksa kode status terlebih dahulu—respons dengan status 500 masih memiliki isi, tetapi isinya tidak akan memuat data yang Anda perlukan.

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

Mengurai JSON dengan response.json()

Panggil response.json() untuk secara otomatis mengurai isi respons sebagai JSON menjadi dict atau list Python. Ini setara dengan json.loads(response.text), tetapi juga memvalidasi bahwa Content-Type sesuai.

Panggil .json() hanya jika Anda yakin responsnya benar-benar berupa JSON—periksa header Content-Type terlebih dahulu.

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}')

Memeriksa Kode Status Sebelum Mengurai

Jangan pernah memanggil response.json() tanpa terlebih dahulu memastikan permintaan berhasil. Respons kesalahan (4xx/5xx) sering kali mengembalikan detail kesalahan dalam JSON—berguna untuk penelusuran kesalahan—tetapi detail tersebut bukan data yang Anda perlukan. Selalu periksa status_code terlebih dahulu.

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() — Memunculkan Kesalahan Secara Otomatis

response.raise_for_status() secara otomatis memunculkan pengecualian HTTPError jika kode statusnya 4xx atau 5xx. Ini adalah cara yang rapi untuk mengubah respons HTTP yang buruk menjadi pengecualian Python, sehingga Anda dapat menggunakan try/except alih-alih rangkaian if/elif yang panjang.

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])

Menangani JSONDecodeError

Terkadang API mengembalikan respons non-JSON saat Anda mengharapkan JSON—halaman kesalahan server dalam HTML, isi yang kosong, atau berkas biner. Memanggil response.json() pada respons tersebut akan memunculkan json.JSONDecodeError. Selalu tangkap kesalahan ini agar agen tidak berhenti secara diam-diam.

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 — Masalah Jaringan

ConnectionError terjadi ketika agen Anda sama sekali tidak dapat menjangkau server—kegagalan resolusi DNS, server sedang luring, atau firewall memblokir permintaan. Ini adalah kegagalan pada tingkat jaringan yang terjadi sebelum proses HTTP apa pun berlangsung.

Berbeda dari kesalahan 5xx, ini bukan respons dari server—koneksi tersebut tidak pernah terjadi.

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

Batas Waktu — Mencegah Agen Macet

Secara bawaan, requests menunggu respons tanpa batas waktu. Server yang lambat atau macet akan membuat agen Anda berhenti tanpa batas. Selalu tetapkan batas waktu: tuple (connect_timeout, read_timeout) dalam satuan detik. Pengecualian Timeout akan muncul jika server tidak merespons tepat waktu.

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')

Penanganan Pengecualian Menyeluruh

Dalam agen produksi, tangkap semua pengecualian requests menggunakan hierarki yang konsisten. requests.exceptions.RequestException adalah kelas dasar untuk semua kesalahan requests—menangkapnya memberi Anda perlindungan terhadap masalah jaringan yang tidak terduga.

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

Mencatat Respons untuk Penelusuran Kesalahan

Ketika perilaku agen tidak sesuai, Anda memerlukan konteks yang cukup untuk mendiagnosisnya. Catat metode permintaan, URL, kode status, dan detail respons yang relevan—tetapi jangan pernah mencatat kunci API. Gunakan modul logging bawaan Python, bukan pernyataan print, untuk agen produksi.

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

Menangani Respons Berhalaman

Banyak API mengembalikan data dalam beberapa halaman. Agen Anda harus mengikuti tautan penomoran halaman untuk mendapatkan semua hasil. Cari URL next dalam respons atau bidang page/cursor, lalu lakukan perulangan sampai tidak ada halaman lagi.

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

Mengalirkan Respons Berukuran Besar

Untuk respons berukuran besar (berkas, keluaran AI yang panjang), gunakan stream=True agar seluruh respons tidak dimuat ke memori sekaligus. Baca respons dalam beberapa bagian. Hal ini penting ketika agen Anda memproses kumpulan data besar atau mengalirkan teks yang dihasilkan AI.

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)

Uji Singkat: raise_for_status

Uji pemahaman Anda tentang penanganan kesalahan respons.

Ringkasan Penanganan Respons

Penanganan respons yang tangguh membedakan agen yang rapuh dari agen yang andal:

  • Selalu periksa status_code sebelum mengurai isi
  • Gunakan response.json() untuk mengurai, lalu tangkap JSONDecodeError jika isi mungkin bukan JSON
  • Gunakan raise_for_status() untuk mengubah kesalahan HTTP menjadi pengecualian
  • Tangkap ConnectionError untuk kegagalan jaringan dan Timeout untuk server yang lambat
  • Selalu tetapkan tuple timeout=(connect, read) pada setiap permintaan
  • Catat permintaan dan respons (tanpa kunci) agar mudah ditelusuri

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menangani Respons dan Error API” gratis?

Ya — teks lengkap “Menangani Respons dan Error API” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menangani Respons dan Error API”?

Mengurai respons JSON, kode error, dan pola penanganan pengecualian. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Agents?

Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menangani Respons dan Error API” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?

Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar REST API untuk Pengembang Agen
  2. Autentikasi: Kunci API dan OAuth
  3. Menangani Respons dan Error API
  4. Pembatasan Laju dan Logika Percobaan Ulang
← Kembali ke AI Agents