การจัดการการตอบกลับและข้อผิดพลาดของ API
แยกวิเคราะห์การตอบกลับ JSON รหัสข้อผิดพลาด และรูปแบบการจัดการข้อยกเว้น
การจัดการการตอบกลับและข้อผิดพลาดของ API เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
ออบเจ็กต์การตอบกลับ
การเรียก requests ทุกครั้งส่งคืนออบเจ็กต์การตอบกลับ ซึ่งประกอบด้วยทุกอย่างที่เซิร์ฟเวอร์ส่งกลับมา ได้แก่ รหัสสถานะ ส่วนหัว และเนื้อหา ก่อนประมวลผลเนื้อหา ให้ตรวจสอบรหัสสถานะเสมอ — การตอบกลับที่มีสถานะ 500 ยังคงมีเนื้อหา แต่จะไม่มีข้อมูลที่คุณต้องการ
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การแยกวิเคราะห์ JSON ด้วย response.json()
เรียก response.json() เพื่อแยกวิเคราะห์เนื้อหาการตอบกลับเป็น JSON ให้เป็นพจนานุกรมหรือรายการของ Python โดยอัตโนมัติ วิธีนี้เทียบเท่ากับ json.loads(response.text) แต่ยังตรวจสอบด้วยว่าส่วนหัวประเภทเนื้อหาเหมาะสม
เรียก .json() เฉพาะเมื่อทราบแน่ชัดว่าการตอบกลับเป็น JSON จริง ๆ — ให้ตรวจสอบส่วนหัวประเภทเนื้อหาก่อน
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}')การตรวจสอบรหัสสถานะก่อนแยกวิเคราะห์
อย่าเรียก response.json() โดยไม่ยืนยันก่อนว่าคำขอสำเร็จ การตอบกลับข้อผิดพลาด (4xx/5xx) มักส่งคืนรายละเอียดข้อผิดพลาดในรูป JSON ซึ่งมีประโยชน์ต่อการแก้ไขข้อบกพร่อง แต่ไม่ใช่ข้อมูลที่คุณต้องการ ตรวจสอบ status_code ก่อนเสมอ
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() — การยกข้อผิดพลาดโดยอัตโนมัติ
response.raise_for_status() จะยกข้อยกเว้น HTTPError โดยอัตโนมัติ หากรหัสสถานะเป็น 4xx หรือ 5xx วิธีนี้เป็นแนวทางที่สะอาดในการเปลี่ยนการตอบกลับ HTTP ที่ไม่ถูกต้องให้เป็นข้อยกเว้นของ Python ทำให้คุณใช้ try/except แทนชุดเงื่อนไขยาว ๆ ได้
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])การจัดการข้อผิดพลาดการแยกวิเคราะห์ JSON
บางครั้ง API ส่งการตอบกลับที่ไม่ใช่ JSON ทั้งที่คุณคาดว่าจะเป็น JSON เช่น หน้าแสดงข้อผิดพลาดของเซิร์ฟเวอร์ใน HTML เนื้อหาว่างเปล่า หรือไฟล์ไบนารี การเรียก response.json() กับข้อมูลเหล่านี้จะทำให้เกิด json.JSONDecodeError จับข้อผิดพลาดนี้เสมอเพื่อป้องกันไม่ให้เอเจนต์หยุดทำงานโดยไม่มีการแจ้งเตือน
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 — ปัญหาเครือข่าย
ConnectionError เกิดขึ้นเมื่อเอเจนต์ของคุณไม่สามารถเข้าถึงเซิร์ฟเวอร์ได้เลย เช่น การแก้ไข DNS ล้มเหลว เซิร์ฟเวอร์ออฟไลน์ หรือไฟร์วอลล์บล็อกคำขอ นี่คือความล้มเหลวระดับเครือข่ายที่เกิดขึ้นก่อนจะมีการสื่อสาร HTTP ใด ๆ
ต่างจาก 5xx นี่ไม่ใช่การตอบกลับของเซิร์ฟเวอร์ — การเชื่อมต่อไม่เคยเกิดขึ้น
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การหมดเวลา — การป้องกันเอเจนต์ค้าง
ตามค่าเริ่มต้น requests จะรอการตอบกลับตลอดไป เซิร์ฟเวอร์ที่ทำงานช้าหรือค้างจะทำให้เอเจนต์ของคุณหยุดนิ่งอย่างไม่มีกำหนด โปรดกำหนดระยะหมดเวลาเสมอ โดยใช้ทูเพิล (connect_timeout, read_timeout) ในหน่วยวินาที ระบบจะยกข้อยกเว้น Timeout หากเซิร์ฟเวอร์ไม่ตอบสนองภายในเวลาที่กำหนด
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')การจัดการข้อยกเว้นอย่างครอบคลุม
ในเอเจนต์สำหรับระบบใช้งานจริง ให้ดักจับข้อยกเว้นทั้งหมดของ requests ตามลำดับชั้นที่สอดคล้องกัน requests.exceptions.RequestException เป็นคลาสฐานของข้อผิดพลาดทั้งหมดจาก requests การดักจับข้อยกเว้นนี้จึงเป็นเครือข่ายความปลอดภัยสำหรับปัญหาเครือข่ายที่ไม่คาดคิด
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การบันทึกการตอบกลับเพื่อแก้ไขข้อบกพร่อง
เมื่อเอเจนต์ทำงานผิดปกติ คุณต้องมีบริบทเพียงพอสำหรับวินิจฉัยปัญหา ให้บันทึกวิธีการของคำขอ URL รหัสสถานะ และรายละเอียดที่เกี่ยวข้องของการตอบกลับ แต่อย่าบันทึกคีย์ API ใช้โมดูล logging ในตัวของ Python แทนคำสั่งพิมพ์สำหรับเอเจนต์ในระบบใช้งานจริง
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การจัดการการตอบกลับแบบแบ่งหน้า
API จำนวนมากส่งข้อมูลเป็นหน้า เอเจนต์ของคุณต้องติดตามลิงก์การแบ่งหน้าเพื่อรับผลลัพธ์ทั้งหมด ให้มองหา URL ถัดไปในการตอบกลับ หรือช่องข้อมูลหน้าหรือเคอร์เซอร์ แล้ววนซ้ำจนกว่าจะไม่มีหน้าเหลือ
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การสตรีมการตอบกลับขนาดใหญ่
สำหรับการตอบกลับขนาดใหญ่ เช่น ไฟล์หรือผลลัพธ์ AI ที่มีความยาว ให้ใช้ stream=True เพื่อหลีกเลี่ยงการโหลดการตอบกลับทั้งหมดไว้ในหน่วยความจำในคราวเดียว ให้อ่านการตอบกลับเป็นส่วน ๆ วิธีนี้จำเป็นอย่างยิ่งเมื่อเอเจนต์ประมวลผลชุดข้อมูลขนาดใหญ่หรือสตรีมข้อความที่สร้างโดย 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)ตรวจสอบความเข้าใจอย่างรวดเร็ว: raise_for_status
ทดสอบความเข้าใจเกี่ยวกับการจัดการข้อผิดพลาดของการตอบกลับ
สรุปการจัดการการตอบกลับ
การจัดการการตอบกลับที่รัดกุมคือสิ่งที่แยกเอเจนต์ที่เปราะบางออกจากเอเจนต์ที่เชื่อถือได้:
- ตรวจสอบ
status_codeก่อนแยกวิเคราะห์เนื้อหาเสมอ - ใช้
response.json()เพื่อแยกวิเคราะห์ และจับJSONDecodeErrorหากเนื้อหาอาจไม่ใช่ JSON - ใช้
raise_for_status()เพื่อเปลี่ยนข้อผิดพลาด HTTP ให้เป็นข้อยกเว้น - จับ
ConnectionErrorสำหรับความล้มเหลวของเครือข่าย และTimeoutสำหรับเซิร์ฟเวอร์ที่ทำงานช้า - กำหนดทูเพิล
timeout=(connect, read)ให้กับคำขอทุกครั้งเสมอ - บันทึกคำขอและการตอบกลับโดยไม่บันทึกคีย์ เพื่อให้แก้ไขข้อบกพร่องได้ง่าย
คำถามที่พบบ่อย
บทเรียน “การจัดการการตอบกลับและข้อผิดพลาดของ API” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการการตอบกลับและข้อผิดพลาดของ API” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการการตอบกลับและข้อผิดพลาดของ API”
แยกวิเคราะห์การตอบกลับ JSON รหัสข้อผิดพลาด และรูปแบบการจัดการข้อยกเว้น คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการการตอบกลับและข้อผิดพลาดของ API” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน REST API สำหรับนักพัฒนาตัวแทน
- การยืนยันตัวตน: คีย์ API และ OAuth
- การจัดการการตอบกลับและข้อผิดพลาดของ API
- การจำกัดอัตราและตรรกะการลองใหม่