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 bytesMengurai 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 returnsBatas 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 NoneMencatat 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 responseMenangani 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_itemsMengalirkan 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_codesebelum mengurai isi - Gunakan
response.json()untuk mengurai, lalu tangkapJSONDecodeErrorjika isi mungkin bukan JSON - Gunakan
raise_for_status()untuk mengubah kesalahan HTTP menjadi pengecualian - Tangkap
ConnectionErroruntuk kegagalan jaringan danTimeoutuntuk 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
- Dasar-Dasar REST API untuk Pengembang Agen
- Autentikasi: Kunci API dan OAuth
- Menangani Respons dan Error API
- Pembatasan Laju dan Logika Percobaan Ulang