บทที่ 4 การพัฒนา HTTP Server ด้วย Python

(HyperText Transfer Protocol)

วัตถุประสงค์การเรียนรู้

1) อธิบายหลักการทำงานของ HTTP Server ได้

2) ติดตั้งและใช้งาน FastAPI ได้

3) พัฒนา HTTP Server สำหรับรับข้อมูลจาก Client ได้

4) ออกแบบ API ด้วย HTTP GET และ POST ได้

5) รับข้อมูลในรูปแบบ JSON ได้

4.1 HTTP Server คืออะไร

HTTP Server (HyperText Transfer Protocol Server) คือโปรแกรมที่ทำหน้าที่ รอรับคำร้องขอ (HTTP Request) จาก Client ผ่านเครือข่าย แล้วประมวลผลคำร้องขอนั้น ก่อนส่งผลลัพธ์กลับไปยัง Client ในรูปแบบ HTTP Response

กล่าวได้ว่า HTTP Server เป็นตัวกลางในการรับส่งข้อมูลระหว่าง Client และระบบต่าง ๆ เช่น ฐานข้อมูล โปรแกรมประยุกต์ หรืออุปกรณ์ IoT

HTTP Server เป็นองค์ประกอบสำคัญของระบบเครือข่ายในปัจจุบัน ไม่ว่าจะเป็นเว็บไซต์ ระบบ Cloud ระบบ Mobile Application หรือระบบ Internet of Things (IoT)

หน้าที่ของ HTTP Server

HTTP Server มีหน้าที่หลักดังต่อไปนี้

1. รอรับการเชื่อมต่อจาก Client

2. รับ HTTP Request

3. วิเคราะห์คำร้องขอของ Client

4. ประมวลผลข้อมูล

5. ติดต่อฐานข้อมูลหรือระบบอื่น (ถ้ามี)

6. สร้าง HTTP Response

7. ส่งผลลัพธ์กลับไปยัง Client

ลำดับการทำงานสามารถสรุปได้ดังนี้

จากรูปจะเห็นว่า HTTP Server เป็นศูนย์กลางของการสื่อสาร โดย Client ไม่สามารถติดต่อฐานข้อมูลโดยตรง แต่ต้องส่งคำร้องขอผ่าน HTTP Server ก่อนเสมอ

องค์ประกอบของ HTTP Server

HTTP Server ประกอบด้วยองค์ประกอบหลัก 4 ส่วน ดังนี้

1) Network Interface

ทำหน้าที่รับข้อมูลจากเครือข่ายผ่าน TCP/IP และเปิดรอการเชื่อมต่อที่หมายเลขพอร์ต (Port Number) ตัวอย่างเช่น HTTP ใช้ Port 80 , HTTPS ใช้ Port 443, FastAPI มักใช้ Port 8000 ในระหว่างการพัฒนา

2) Request Handler

ทำหน้าที่รับ HTTP Request และตรวจสอบข้อมูล เช่น HTTP Method, URL , Header, Body จากนั้นจึงส่งต่อไปยังโปรแกรมที่เกี่ยวข้อง

3) Application Logic

เป็นส่วนที่ประมวลผลข้อมูลตามที่ผู้พัฒนาโปรแกรมกำหนด เช่น คำนวณข้อมูล, ตรวจสอบสิทธิ์ผู้ใช้งาน,ค้นหาข้อมูล,รับข้อมูลจากเซนเซอร์,บันทึกข้อมูลลงฐานข้อมูล

4)Response Generator

เมื่อประมวลผลเสร็จ HTTP Server จะสร้าง HTTP Response แล้วส่งกลับไปยัง Client ผลลัพธ์อาจเป็น HTML,JSON,รูปภาพ, ไฟล์ PDF,ข้อความธรรมดา

ลำดับการทำงานของ HTTP Server

ตัวอย่างเมื่อผู้ใช้เปิดเว็บไซต์

Browser ส่งคำร้องขอ GET /

Server ค้นหาไฟล์ แล้ว ส่ง HTML กลับ

หรือตัวอย่าง ในระบบ Internet of Things

ESP32 ส่งข้อมูลอุณหภูมิไปยัง HTTP Server แล้ว Server ตรวจสอบข้อมูล บันทึกลงฐานข้อมูล และ ตอบกลับ

เครื่องมือที่ใช้พัฒนา HTTP Server

การพัฒนา HTTP Server ในปัจจุบันมีเครื่องมือและซอฟต์แวร์ที่ช่วยให้การเขียนโปรแกรมเป็นไปอย่างสะดวกและมีประสิทธิภาพมากขึ้น ผู้พัฒนาไม่จำเป็นต้องสร้าง HTTP Server ตั้งแต่ระดับโปรโตคอล TCP แต่สามารถใช้ Framework และ Library ที่มีอยู่แล้ว เพื่อลดความซับซ้อนของการพัฒนา

ในรายวิชานี้จะเลือกใช้ ภาษา Python และ FastAPI ในการพัฒนา HTTP Server เนื่องจากเป็นเครื่องมือที่เรียนรู้ได้ง่าย มีประสิทธิภาพสูง และได้รับความนิยมในการพัฒนาระบบ Web API และ Internet of Things (IoT)

ภาพรวมของเครื่องมือที่ใช้พัฒนา HTTP Server แสดงดังรูป

1) ภาษา Python

Python เป็นภาษาโปรแกรมแบบ High-Level ที่ได้รับความนิยมอย่างแพร่หลาย เนื่องจากมีรูปแบบคำสั่งที่อ่านง่ายและมีไลบรารีจำนวนมาก ทำให้เหมาะสำหรับการพัฒนาโปรแกรมเครือข่าย ระบบเว็บ ระบบฐานข้อมูล และปัญญาประดิษฐ์ (Artificial Intelligence)

ข้อดีของภาษา Python ได้แก่

- ไวยากรณ์ (Syntax) อ่านง่าย

- พัฒนาโปรแกรมได้รวดเร็ว

- มีไลบรารีสำหรับงานเครือข่ายจำนวนมาก

- รองรับทุกระบบปฏิบัติการ

- ใช้ร่วมกับฐานข้อมูลได้หลายชนิด

- รองรับการพัฒนา REST API และระบบ IoT

FastAPI

FastAPI เป็น Framework สำหรับพัฒนา Web API และ HTTP Server ด้วยภาษา Python โดยรองรับมาตรฐาน REST API และสามารถรับส่งข้อมูลในรูปแบบ JSON ได้อย่างมีประสิทธิภาพ FastAPI มีข้อดีหลายประการ เช่น

- พัฒนาได้รวดเร็ว

- รองรับ REST API

- มีระบบตรวจสอบข้อมูลอัตโนมัติ (Validation)

- สร้างเอกสาร API (Swagger UI) อัตโนมัติ

- รองรับการทำงานแบบ Asynchronous

- ประสิทธิภาพสูง

ตัวอย่างการสร้าง HTTP Server ด้วย FastAPI


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def home():
    return {"message":"Hello World"}

เมื่อรันโปรแกรม FastAPI จะสร้าง HTTP Server พร้อมรับการเชื่อมต่อจาก Client

Uvicorn

FastAPI เป็นเพียง Framework สำหรับเขียนโปรแกรม แต่ไม่สามารถทำงานได้ด้วยตนเอง จำเป็นต้องมีโปรแกรมที่ทำหน้าที่รัน HTTP Server ซึ่งเรียกว่า ASGI Server ในรายวิชานี้จะใช้ Uvicorn เป็น ASGI Server หน้าที่ของ Uvicorn ได้แก่

- เปิดหมายเลขพอร์ต (Port)

- รอรับการเชื่อมต่อจาก Client

- รับ HTTP Request

- ส่ง HTTP Request ไปยัง FastAPI

- ส่ง HTTP Response กลับไปยัง Client

ความสัมพันธ์ระหว่าง Uvicorn และ FastAPI แสดงดังรูป

คำสั่งสำหรับรัน Server

python -m uvicorn server:app --reload

PostgreSQL

PostgreSQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (Relational Database Management System: RDBMS) หน้าที่ของ PostgreSQL ได้แก่

- จัดเก็บข้อมูล

- ค้นหาข้อมูล

- แก้ไขข้อมูล

- ลบข้อมูล

เครื่องมือทั้งหมดทำงานร่วมกันดังลักษณะในรูป

ลำดับการทำงาน

1. Client ส่ง HTTP Request

2. Uvicorn รับคำร้องขอ

3. FastAPI ประมวลผลข้อมูล

4. Pydantic ตรวจสอบข้อมูล

5. FastAPI ติดต่อ PostgreSQL

6. PostgreSQL ส่งผลลัพธ์กลับ

7. FastAPI สร้าง HTTP Response

8. Uvicorn ส่ง Response ไปยัง Client

ตัวอย่างการสร้างเซิฟเวอร์ สำหรับการให้บริการข้อมูแก่ Client ผ่านทางเครือข่าย

1. สร้างไฟล์ server.py เก็บไว้ในโพลเดอร์ของตัวเองที่ไม่รวมกันกับโฟลเดอร์โปรแกรม python


from fastapi import FastAPI

app = FastAPI()


# -------------------------
# หน้าแรก
# -------------------------
@app.get("/")
def home():
    return {
        "message": "Welcome to Network Programming"
    }


# -------------------------
# ข้อมูลนักศึกษา
# -------------------------
@app.get("/student")
def student():
    return {
        "student_id": "6530001",
        "name": "Somchai",
        "major": "Telecommunication Engineering"
    }


# -------------------------
# ข้อมูลอาจารย์
# -------------------------
@app.get("/teacher")
def teacher():
    return {
        "teacher": "Dr. Sunya",
        "faculty": "Engineering"
    }


# -------------------------
# ข้อมูลอุณหภูมิ
# -------------------------
@app.get("/temperature")
def temperature():
    return {
        "temperature": 30.5,
        "unit": "C"
    }


# -------------------------
# ข้อมูลความชื้น
# -------------------------
@app.get("/humidity")
def humidity():
    return {
        "humidity": 72,
        "unit": "%"
    }


# -------------------------
# สถานะเซิร์ฟเวอร์
# -------------------------
@app.get("/status")
def status():
    return {
        "status": "Running",
        "client": 5
    }


2. รัน Server

เปิด Command Prompt

เปลี่ยนโฟลเดอร์ไปยังโพลเดอร์ที่เก็บไฟล์ server.py แล้ว ใช้คำสั่ง

C:\Users\psuny\AppData\Local\Programs\Python\Python314\python.exe -m uvicorn server:app --reload

จะปรากฏหน้าต่างการทำงานของเซิฟเวอร์ดังรูป

3. เปิด Browser ป้อน http://127.0.0.1:8000/ เพื่อขอข้อมูลใน Method Get/ จากเซิฟเวอร์ (ในกรณีใช้เครื่องเดียวกัน) เป็นทั้ง Server และ Client

จะได้การตอบสนอง Response กลับมาเป็นข้อมูลในรูปแบบ JSON ดังรูป

4. ให้ทดลองเปลี่ยน url เป็น http://127.0.0.1:8000/teacher ก็จะได้รับการ Response กลับเป็นข้อมูล JSON ของฟังก์ชัน /teacher ดังรูป

จากตัวอย่างเป็นการขอข้อมูลในรูปแบบ GET Method จากเซิฟเวอร์

########################################################################

ตัวอย่างการใช้ Method GET และ POST

1. ให้สร้างไฟล์ตามตัวอย่าง


from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# -----------------------------
# กำหนดรูปแบบข้อมูล JSON
# -----------------------------
class SensorData(BaseModel):
    device_id: str
    temperature: float
    humidity: float


# -----------------------------
# GET Method
# -----------------------------
@app.get("/")
def home():
    return {
        "message": "Welcome to Network Programming"
    }


@app.get("/student")
def student():
    
    return {
        "student_id": "6530001",
        "name": "Somchai",
        "major": "Telecommunication Engineering"
    }

@app.get("/student2")
def student(id: int, name: str):
    print("ID student   :",id)
    print("Name :", name)

    return {
        "id": id,
        "name": name
    }
    return {
        "id": id,
        "name": name
    }


@app.get("/teacher")
def teacher():
    return {
        "teacher": "Dr. Sunya",
        "faculty": "Engineering"
    }


@app.get("/temperature")
def temperature():
    return {
        "temperature": 30.5,
        "unit": "C"
    }


@app.get("/humidity")
def humidity():
    return {
        "humidity": 72,
        "unit": "%"
    }


@app.get("/status")
def status():
    return {
        "status": "Running",
        "client": 5
    }


# -----------------------------
# POST Method
# -----------------------------
@app.post("/sensor")
def receive_sensor(data: SensorData):

    print("\n========== Receive Data ==========")
    print("Device ID   :", data.device_id)
    print("Temperature :", data.temperature)
    print("Humidity    :", data.humidity)
    print("=================================\n")

    return {
        "status": "OK",
        "message": "Data received successfully"
    }


2. ให้ทำการรันไฟล์ server2 เพื่อรอกการติดต่อมาจาก Client โดยหน้าต่าง command promt ด้วยคำสั่ง

C:\Users\psuny\AppData\Local\Programs\Python\Python314\python.exe -m uvicorn server2:app --reload

3. ให้สร้างไฟล์ผั่ง Client ดังตัวอย่าง


import requests

url = "http://127.0.0.1:8000/sensor"

data = {
    "device_id": "ESP32_01",
    "temperature": 30.5,
    "humidity": 70
}

response = requests.post(url, json=data)

print(response.json())

4. ให้รันไฟล์ของ client เพื่อส่งข้อมูลแบบ Method POST ส่งไปยังเซิฟเวอร์ ที่หน้าต่าง command Prompt ของเซิฟจะปรากฏข้อมูลที่ Client ส่งไปดังรูป

และที่หน้าต่างของ Client จะปรากฏข้อความตอบกลับมาจาก Server ดังรูป

หัวข้อ