0Pricing
AI Agents · บทเรียน

การจัดการการตอบกลับและข้อผิดพลาดของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน REST API สำหรับนักพัฒนาตัวแทน
  2. การยืนยันตัวตน: คีย์ API และ OAuth
  3. การจัดการการตอบกลับและข้อผิดพลาดของ API
  4. การจำกัดอัตราและตรรกะการลองใหม่
← กลับไปที่ AI Agents