Xây dựng một API Endpoint

Phát triển phần mềm với Claude Code

Dani Zysman

AI Curriculum Manager @ DataCamp

Từ truy vấn đến API

recraft: half: Một lập trình viên tại bàn làm việc với trợ lý Claude AI hỗ trợ xây dựng API, hiển thị mã với kết nối cơ sở dữ liệu

  • Video trước: Truy vấn cơ sở dữ liệu tương tác
  • Bây giờ: Thêm một endpoint cho Music Analytics API
    • Một prompt, một endpoint chạy được, mã Python thật
Phát triển phần mềm với Claude Code

Dự án đến hiện tại

music-analytics-api/
  app.py             # API hiện có (cập nhật để đăng ký db_routes)
  routes.py          # Các route hiện có
  models.py          # Mô hình Artist/Album
  db_routes.py       # <- Blueprint mới dùng cơ sở dữ liệu
  chinook.db
  test_routes.py
  CLAUDE.md
Phát triển phần mềm với Claude Code

Nhờ Claude xây giúp

> Tạo blueprint db_routes.py mới với một endpoint tại 
/artists/<artist_id>/albums trả về toàn bộ album của 
một nghệ sĩ cụ thể dưới dạng JSON từ chinook,db. Đăng ký nó với @app.py
1. db_routes py - Flask Blueprint mới với:
    - hàm trợ giúp get_db_connection() để kết nối chinook.db
    - Thêm endpoint truy vấn cơ sở dữ liệu lấy tất cả album của một nghệ sĩ cụ thể
    - Trả về JSON với các trường AlbumId, Title và ArtistId
2. Cập nhật app.py 
    - Đăng ký blueprint để bật endpoint mới

Endpoint sẽ trả về 404 nếu nghệ sĩ không tồn tại, 
và trả về danh sách album đã sắp xếp theo title dưới dạng JSON.
Phát triển phần mềm với Claude Code

Mã được tạo

@app.route("/artists/<int:artist_id>/albums")
def get_artist_albums(artist_id):
    conn = get_db()
    artist = conn.execute("SELECT ... WHERE ArtistId = ?", ...)
    albums = conn.execute("SELECT ... WHERE ArtistId = ?", ...)
    conn.close()
    return jsonify({"artist": ..., "albums": [...]})
Phát triển phần mềm với Claude Code

Kiểm thử cục bộ

$ python app.py & PID=$! && sleep 3 && curl http://127.0.0.1:5000/artists/1/albums
&& kill $PID
127.0.0.1 "GET /artists/1/albums HTTP/1.1" 200
[
    {
     "album_id": 1,
     "artist_id": 1,
     "title": "For Those About To Rock We Salute You"
    },
    {
     "album_id": 4,
     "artist_id": 1,
     "title": "Let There Be Rock"
    }
]
Phát triển phần mềm với Claude Code

Xử lý các trường hợp biên

  • Nếu như...
    • Artist ID không tồn tại?
    • Nghệ sĩ không có album?
    • Định dạng ID không hợp lệ?
    • Mã hiện tại trả về {"albums": []} rỗng
  • Phản hồi tốt hơn:
    • 404 kèm thông điệp rõ ràng
    • Cấu trúc phản hồi đã được kiểm tra
    • Xử lý lỗi đúng cách
Phát triển phần mềm với Claude Code

Thêm kiểm tra với Pydantic

from pydantic import BaseModel
from typing import List

class Album(BaseModel):
    id: int
    title: str

class ArtistAlbums(BaseModel):
    artist_id: int
    albums: List[Album]
  • Pydantic cung cấp:
    • Kiểm tra kiểu dữ liệu
    • Tuần tự hóa tự động
    • Thông báo lỗi rõ ràng
    • Schema tự mô tả
Phát triển phần mềm với Claude Code

Nhờ Claude thêm kiểm tra

> Thêm kiểm tra Pydantic vào @db_routes.py. Trả về 404 kèm thông điệp nếu 
artist không tồn tại hoặc không có album.
Xong! Đã thêm kiểm tra Pydantic vào db_routes.py:
Thay đổi:
- Thêm model Album (album_id, title, artist_id)
- Trả về 404 "Artist not found" nếu artist không tồn tại
- Trả về 404 "Artist has no albums" nếu artist không có album
- Kiểm tra từng album theo model Album trước khi trả về
- Trả về 400 khi lỗi kiểm tra
Phản hồi:
- 404 "Artist not found"
- 404 "Artist has no albums"  
- 200 với dữ liệu album đã kiểm tra
Phát triển phần mềm với Claude Code

Cùng luyện tập nào!

Phát triển phần mềm với Claude Code

Preparing Video For Download...