Programming
น้องๆ เคยสงสัยมั้ยว่า API (Application Programming Interface) คืออะไร? สมัยผมทำร้านเน็ตฯ ใหม่ๆ API ยังไม่บูมขนาดนี้หรอก แต่พอโลกมันเชื่อมกันหมด การสื่อสารระหว่างโปรแกรมมันสำคัญมากๆ API ก็เหมือนเป็นตัวกลางที่ทำให้โปรแกรมคุยกันได้รู้เรื่อง
FastAPI เนี่ย เป็น Python framework ที่ช่วยให้เราสร้าง API ได้ง่าย เร็ว และดีมากๆ สมัยก่อนกว่าจะทำ API ได้แต่ละที ต้องลง library นู่นนี่นั่น วุ่นวายไปหมด แต่ FastAPI มันจัดการให้หมดแล้ว
ทำไมมันถึงสำคัญ? ก็เพราะว่าทุกวันนี้ application มันซับซ้อนขึ้นเยอะ backend ก็ต้องทำงานหลากหลายมากขึ้น การมี API ที่ดี ทำให้เรา scale ระบบได้ง่าย พัฒนาต่อยอดได้คล่องตัว และที่สำคัญคือมันช่วยประหยัดเวลาของ developer อย่างเราๆ ไปได้เยอะเลยล่ะ
แน่นอนว่าถ้าจะใช้ FastAPI ได้คล่อง เราต้องมีพื้นฐาน Python ที่ดีพอสมควรนะ พวกตัวแปร data types (int, string, list, dictionary) function class object พื้นฐานพวกนี้ต้องแน่นๆ
def add(x: int, y: int) -> int:
return x + y
print(add(5, 3)) # Output: 8
Code ข้างบนเป็นตัวอย่าง function ง่ายๆ ใน Python ที่รับ input เป็น integer สองตัว แล้ว return ผลบวกออกมา ลองศึกษาดูนะ ถ้ายังไม่แม่นเรื่อง type hints (x: int, -> int) ไปหาอ่านเพิ่มเติมได้เลย ช่วยให้ code เราอ่านง่ายขึ้นเยอะ
API ส่วนใหญ่ทำงานบน HTTP protocol เพราะฉะนั้นเราต้องเข้าใจ concepts พื้นฐานของ HTTP เช่น methods (GET, POST, PUT, DELETE) status codes (200 OK, 404 Not Found, 500 Internal Server Error) headers พวกนี้สำคัญหมด
ลองนึกภาพเวลาเราเข้าเว็บ เว็บ browser จะส่ง request ไปที่ server โดยใช้ method GET เพื่อขอข้อมูล Server ก็จะ response กลับมาพร้อมข้อมูล และ status code บอกว่าทุกอย่างเรียบร้อยดี (200 OK) หรือมีอะไรผิดพลาด (เช่น 404 Not Found ถ้าเราพิมพ์ URL ผิด)
API ส่วนใหญ่มักจะส่งข้อมูลในรูปแบบ JSON (JavaScript Object Notation) เพราะมันอ่านง่ายและโปรแกรมส่วนใหญ่รองรับ JSON หมดแล้ว
{
"name": "Bom",
"age": 40,
"city": "Bangkok"
}
JSON ก็คือ data structure ที่มี key-value pairs คล้ายๆ dictionary ใน Python แต่มี syntax ที่เป็นมาตรฐานกว่า ทำให้ส่งข้อมูลข้ามภาษาได้ง่าย SiamCafe Blog มีบทความเกี่ยวกับ JSON อยู่ ลองไปอ่านเพิ่มเติมได้นะ
FastAPI ใช้งานง่ายมากจริงๆ แค่มี Python กับ pip ก็เริ่มได้เลย สมัยผมทำร้านเน็ตฯ ต้องลงโปรแกรมเยอะแยะกว่าจะเริ่มเขียนโปรแกรมได้ เดี๋ยวนี้มันง่ายขึ้นเยอะเลย
ก่อนอื่นเราต้องติดตั้ง FastAPI framework และ ASGI server ชื่อ Uvicorn ก่อน Uvicorn จะทำหน้าที่รัน FastAPI application ของเรา
pip install fastapi uvicorn
เปิด command line หรือ terminal แล้วพิมพ์คำสั่งข้างบน pip จะจัดการ download และติดตั้ง package ให้เราเอง
สร้างไฟล์ main.py แล้วใส่ code ข้างล่างนี้เข้าไป
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
Code นี้คือ FastAPI application ที่ง่ายที่สุด มันสร้าง endpoint ที่ root path ("/") และ return JSON response {"Hello": "World"}
เปิด command line หรือ terminal แล้วพิมพ์คำสั่งนี้
uvicorn main:app --reload
main คือชื่อไฟล์ Python ของเรา app คือชื่อ FastAPI instance ที่เราสร้างไว้ --reload คือ option ที่ทำให้ server restart เองโดยอัตโนมัติเมื่อเราแก้ไข code
เปิด browser แล้วเข้า http://127.0.0.1:8000 เราก็จะเห็น JSON response {"Hello": "World"}
Path parameters คือส่วนของ URL ที่เราใช้ส่งข้อมูลไปให้ API เช่น /items/123 123 คือ path parameter ที่บอกว่าเราต้องการ item ที่มี ID เป็น 123
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
Code นี้สร้าง endpoint /items/{item_id} โดยที่ {item_id} คือ path parameter ที่เรากำหนดให้เป็น integer (item_id: int) FastAPI จะจัดการ validate ให้เราเองว่า parameter ที่ส่งมาเป็น integer จริงๆ
Query parameters คือ parameters ที่ต่อท้าย URL ด้วยเครื่องหมาย ? เช่น /items?skip=0&limit=10 skip และ limit คือ query parameters ที่บอกว่าเราต้องการ item ตั้งแต่ index 0 เป็นต้นไป และเอามาแค่ 10 items
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
Code นี้สร้าง endpoint /items/ โดยมี query parameters skip และ limit ซึ่งมี default value เป็น 0 และ 10 ตามลำดับ ถ้าเราไม่ส่ง query parameters มา FastAPI ก็จะใช้ default values เอง
FastAPI ไม่ใช่ framework เดียวที่ใช้สร้าง API ได้ ยังมีทางเลือกอื่นๆ อีกเยอะ เช่น Flask, Django REST framework, Node.js Express แต่ละตัวก็มีข้อดีข้อเสียต่างกันไป
Flask เป็น micro-framework ที่ lightweight และ flexible เหมาะสำหรับ project เล็กๆ ที่ไม่ต้องการ features เยอะแยะ Django REST framework เป็น framework ที่ full-featured มี features ครบครัน เหมาะสำหรับ project ใหญ่ๆ ที่ต้องการ scalability และ security ส่วน Node.js Express เป็น framework ที่ใช้ JavaScript เหมาะสำหรับคนที่ถนัด JavaScript และต้องการ build full-stack application
แต่ FastAPI มีข้อดีที่โดดเด่นคือมันเร็วมากๆ (ตามชื่อเลย) และใช้งานง่าย แถมยังมี automatic data validation และ documentation generation อีกด้วย ทำให้มันเป็นตัวเลือกที่ดีสำหรับ project ที่ต้องการ performance และ maintainability
| Framework | ภาษา | ข้อดี | ข้อเสีย | เหมาะกับ |
|---|---|---|---|---|
| FastAPI | Python | เร็ว, ใช้งานง่าย, Automatic validation & documentation | อาจจะไม่ full-featured เท่า Django | Project ที่ต้องการ performance และ maintainability |
| Flask | Python | Lightweight, Flexible | ต้อง implement หลายอย่างเอง | Project เล็กๆ |
| Django REST framework | Python | Full-featured, Scalable, Secure | Complexity สูง | Project ใหญ่ๆ |
| Node.js Express | JavaScript | ใช้ JavaScript, Full-stack development | JavaScript ecosystem อาจจะวุ่นวาย | Project ที่ใช้ JavaScript เป็นหลัก |
ลองพิจารณาดูนะว่า framework ไหนเหมาะกับ project ของน้องๆ มากที่สุด ไม่มี framework ไหนที่ดีที่สุดสำหรับทุกสถานการณ์ SiamCafe Blog มีบทความเปรียบเทียบ framework ต่างๆ อยู่ ลองไปอ่านเพิ่มเติมได้เลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับPython Api Fastapi Tutorial:
เอาล่ะน้องๆ มาถึงส่วนที่สำคัญที่สุดแล้ว นั่นก็คือ "ของจริง" ที่พี่เจอมากับตัว สมัยทำร้านเน็ต SiamCafe น่ะ API มันยังไม่ฮิตขนาดนี้หรอก แต่หลักการมันคล้ายๆ กัน สิ่งที่พี่จะบอกต่อไปนี้คือสิ่งที่ช่วยให้ชีวิตเราง่ายขึ้นเยอะ ตอนเขียน API ด้วย FastAPI
Dependency Injection (DI) เนี่ย เหมือนมีคนคอยส่งของที่เราต้องการมาให้ถึงที่ ไม่ต้องเสียเวลาไปหาเอง สมมติว่าเราต้อง connect database ทุกครั้งที่เรียก API แทนที่จะเขียนโค้ด connect ซ้ำๆ กันทุก route เราก็สร้าง function ที่ทำหน้าที่ connect database แล้ว inject เข้าไปใน route ของเรา
from fastapi import Depends, FastAPI
from sqlalchemy import create_engine, Session
DATABASE_URL = "sqlite:///./test.db" # ยกตัวอย่าง SQLite นะ
engine = create_engine(DATABASE_URL)
def get_db():
db = Session(engine)
try:
yield db
finally:
db.close()
app = FastAPI()
@app.get("/items/")
async def read_items(db: Session = Depends(get_db)):
# db คือ Session ที่ inject เข้ามา
items = db.query(Item).all() # สมมติว่ามี Item model
return items
เห็นไหม โค้ดเราสั้นลงเยอะ แถมยัง reusable อีกด้วย เวลาเปลี่ยน database ก็แก้แค่ function get_db ที่เดียว จบ!
อย่าไว้ใจ input จาก user! สมัยก่อนโดน hack เพราะช่องโหว่นี้เยอะมาก FastAPI ช่วยเราได้เยอะเรื่อง validation โดยใช้ Pydantic model กำหนด data type และ constraint ต่างๆ
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, validator
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@validator('price')
def price_must_be_positive(cls, value):
if value <= 0:
raise ValueError('Price must be positive')
return value
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
# FastAPI จะ validate ให้เอง ถ้าไม่ผ่านจะ throw error
return item
ถ้า price ติดลบ FastAPI จะ throw HTTPException ให้เอง เราไม่ต้องเขียน if-else ดักเองให้วุ่นวาย
Logging คือเพื่อนที่ดีที่สุดของโปรแกรมเมอร์ โดยเฉพาะตอน debug API ที่ production สมัยก่อนร้านเน็ตล่มทีนึง หาต้นตอแทบตาย เพราะไม่ได้ log อะไรไว้เลย FastAPI integrate กับ logging library ของ Python ได้ง่ายมาก
import logging
from fastapi import FastAPI
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()
@app.get("/ping")
async def ping():
logger.info("Ping endpoint called")
return {"message": "pong"}
แค่นี้เราก็รู้แล้วว่า endpoint ไหนถูกเรียกบ้าง เวลา error เกิดขึ้น ก็ดู log หาต้นตอได้ง่ายขึ้น
อย่าปล่อยให้ error หลุดไปเฉยๆ user จะงงว่าเกิดอะไรขึ้น FastAPI มีวิธีจัดการ error ที่สวยงาม โดยใช้ HTTPException
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
ถ้า item_id ไม่มีใน items FastAPI จะ return HTTP 404 Not Found พร้อม message บอกว่า "Item not found" ทันที
FastAPI เหมาะกับงานที่ต้องการความเร็ว (fast!) และ performance สูง เช่น API สำหรับ mobile app, web application หรือ microservices นอกจากนี้ยังเหมาะกับงานที่ต้องการความง่ายในการพัฒนา (easy to learn and use)
Flask เป็น microframework ที่ lightweight และ flexible ส่วน FastAPI เป็น full-featured framework ที่มี feature เยอะกว่า เช่น automatic data validation, dependency injection และ automatic API documentation (Swagger UI) ถ้าโปรเจกต์ใหญ่และซับซ้อน FastAPI จะช่วยให้เราทำงานได้ง่ายขึ้นเยอะ
FastAPI รองรับ database เกือบทุกชนิดที่ Python รองรับ ไม่ว่าจะเป็น PostgreSQL, MySQL, MongoDB, SQLite หรือแม้แต่ NoSQL database อย่าง Cassandra
FastAPI ถูกออกแบบมาให้มี performance สูงมากๆ โดยใช้ ASGI (Asynchronous Server Gateway Interface) ทำให้สามารถ handle request ได้พร้อมๆ กันจำนวนมาก เหมาะกับงานที่ต้องการ scalability สูง
FastAPI เป็น framework ที่น่าสนใจมากๆ สำหรับการพัฒนา API ด้วย Python ด้วยความเร็ว ความง่าย และ feature ที่ครบครัน ทำให้เป็นตัวเลือกที่ดีสำหรับโปรเจกต์ขนาดเล็กไปจนถึงขนาดใหญ่ ลองเอาเทคนิคที่พี่แนะนำไปปรับใช้ดูนะ รับรองว่าชีวิตจะง่ายขึ้นเยอะ!
อย่าลืมแวะไปดู SiamCafe Blog นะน้อง มีบทความดีๆ อีกเยอะเลย
ถ้าสนใจเรื่อง Forex ลองดูที่ iCafeForex ได้นะ