Bangun Satu Endpoint API

Pengembangan Perangkat Lunak dengan Claude Code

Dani Zysman

AI Curriculum Manager @ DataCamp

Dari Kueri ke API

recraft: half: Seorang developer di meja dengan asisten Claude AI membantu membangun API, menampilkan kode di layar dengan koneksi basis data

  • Video Sebelumnya: Melakukan kueri basis data secara interaktif
  • Sekarang: Tambah satu endpoint ke Music Analytics API
    • Satu prompt, satu endpoint siap pakai, kode Python nyata
Pengembangan Perangkat Lunak dengan Claude Code

Proyek Sejauh Ini

music-analytics-api/
  app.py             # API yang ada (diperbarui untuk mendaftarkan db_routes)
  routes.py          # Rute yang ada
  models.py          # Model Artist/Album
  db_routes.py       # <- Blueprint baru berbasis database
  chinook.db
  test_routes.py
  CLAUDE.md
Pengembangan Perangkat Lunak dengan Claude Code

Minta Claude untuk Membangunnya

> Buat blueprint db_routes.py baru dengan endpoint di 
/artists/<artist_id>/albums yang mengembalikan semua album oleh 
artis tertentu sebagai JSON dari chinook,db. Daftarkan dengan @app.py
1. db_routes py - Flask Blueprint baru dengan:
    - helper get_db_connection() untuk terhubung ke chinook.db
    - Menambahkan endpoint yang mengkueri semua album oleh artis tertentu
    - Mengembalikan JSON dengan field AlbumId, Title, dan ArtistId
2. Memperbarui app.py 
    - Mendaftarkan blueprint agar endpoint baru aktif

Endpoint akan mengembalikan 404 jika artis tidak ada, 
dan mengembalikan album diurutkan berdasarkan judul sebagai JSON.
Pengembangan Perangkat Lunak dengan Claude Code

Kode yang Dihasilkan

@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": [...]})
Pengembangan Perangkat Lunak dengan Claude Code

Uji Secara Lokal

$ 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"
    }
]
Pengembangan Perangkat Lunak dengan Claude Code

Tangani Kasus Tepi

  • Bagaimana jika...
    • ID artis tidak ada?
    • Artis tidak punya album?
    • Format ID tidak valid?
    • Kode saat ini mengembalikan kosong {"albums": []}
  • Respons yang lebih baik:
    • 404 dengan pesan jelas
    • Struktur respons terverifikasi
    • Penanganan error yang tepat
Pengembangan Perangkat Lunak dengan Claude Code

Tambah Validasi dengan 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 menyediakan:
    • Validasi tipe
    • Serialisasi otomatis
    • Pesan error yang jelas
    • Skema terdokumentasi mandiri
Pengembangan Perangkat Lunak dengan Claude Code

Minta Claude Menambahkan Validasi

> Tambahkan validasi Pydantic ke @db_routes.py. Kembalikan 404 dengan pesan jika 
artis tidak ada atau tidak punya album.
Selesai! Menambahkan validasi Pydantic ke db_routes.py:
Perubahan:
- Menambahkan model Album (album_id, title, artist_id)
- Mengembalikan 404 "Artist not found" jika artis tidak ada
- Mengembalikan 404 "Artist has no albums" jika artis tidak punya album
- Memvalidasi tiap album terhadap model Album sebelum mengembalikan
- Mengembalikan 400 pada error validasi
Respons:
- 404 "Artist not found"
- 404 "Artist has no albums"  
- 200 dengan data album terverifikasi
Pengembangan Perangkat Lunak dengan Claude Code

Ayo berlatih!

Pengembangan Perangkat Lunak dengan Claude Code

Preparing Video For Download...