Nếu bạn đã từng tự hỏi: “Làm sao trình duyệt biết cách tải dữ liệu từ máy chủ?” hay “HTTP Server thật ra làm gì?” — thì bài viết này chính là dành cho bạn.
Hôm nay, chúng ta sẽ xây dựng một HTTP Server cơ bản bằng Python, có khả năng xử lý yêu cầu (request), gửi phản hồi (response), và giả lập hoạt động như một API thật.
Đừng lo, chúng ta không cần framework phức tạp như Flask hay Django. Python có sẵn mọi thứ bạn cần để tạo một HTTP Server chỉ với vài chục dòng code!
🔍 HTTP Server là gì?
HTTP (HyperText Transfer Protocol) là “ngôn ngữ” chung giúp trình duyệt (client) và máy chủ (server) trao đổi thông tin.
Một HTTP Server là “người trung gian” chịu trách nhiệm:
- Nhận yêu cầu (request) từ client.
- Xử lý và tìm đúng dữ liệu cần trả về.
- Gửi phản hồi (response) theo định dạng chuẩn HTTP.
Hãy tưởng tượng HTTP giống như một nhà hàng:
- Bạn (client) gọi món ăn → đó là HTTP Request.
- Nhân viên phục vụ (server) ghi nhận yêu cầu, mang vào bếp, nhận lại món ăn → đó là HTTP Response.
- Nếu bạn gọi món không có trong thực đơn, nhân viên báo “404 Không tìm thấy món ăn”
🌤️ Bước 1: Tạo dữ liệu giả lập (Fake Weather Data)
Chúng ta sẽ tạo một “cơ sở dữ liệu” thời tiết giả lập bằng Python.
File này đóng vai trò như backend giả, giúp server của bạn có dữ liệu để phản hồi lại khi có yêu cầu.
👉 Tạo file mới: fake_weather_data.py
# fake_weather_data.py
# Dữ liệu thời tiết giả lập
fake_weather = {
"Tokyo": {"temp": 22, "condition": "Cloudy"},
"New York": {"temp": 18, "condition": "Sunny"},
"Paris": {"temp": 20, "condition": "Rainy"},
"London": {"temp": 16, "condition": "Foggy"}
}
# Trả về danh sách thành phố
def list_cities():
return list(fake_weather.keys())
# Lấy thông tin thời tiết theo tên thành phố
def get_weather(city):
return fake_weather.get(city, {"error": "City not found"})
Đây chính là “API dữ liệu” của chúng ta — bạn có thể dễ dàng mở rộng nó để lấy dữ liệu thật từ các API ngoài như OpenWeatherMap.
🌐 Bước 2: Xây dựng HTTP Server trong Python
Giờ thì ta sẽ tạo server thực thụ — chương trình này sẽ:
- Lắng nghe các yêu cầu tại địa chỉ
127.0.0.1:5000 - Phản hồi danh sách thành phố tại
/weather/cities - Phản hồi chi tiết thời tiết tại
/get_weather?city=...
👉 Tạo file weather_server.py
# weather_server.py
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
from urllib.parse import urlparse, parse_qs
from fake_weather_data import list_cities, get_weather
HOST = "127.0.0.1"
PORT = 5000
class WeatherRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_path = urlparse(self.path)
if parsed_path.path == "/weather/cities":
cities = list_cities()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps({"cities": cities}).encode())
elif parsed_path.path == "/get_weather":
query = parse_qs(parsed_path.query)
city = query.get("city", [None])[0]
weather = get_weather(city)
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps({"weather": weather}).encode())
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b"Not Found")
if __name__ == "__main__":
print(f"🚀 Server đang chạy tại: http://{HOST}:{PORT}")
server = HTTPServer((HOST, PORT), WeatherRequestHandler)
server.serve_forever()
📘 Giải thích nhanh:
BaseHTTPRequestHandler: Lớp cơ bản để tạo server tùy chỉnh.do_GET: Hàm xử lý các yêu cầu GET./weather/cities: Trả danh sách thành phố./get_weather?city=Paris: Trả thông tin thời tiết của thành phố được chỉ định.404: Trả lỗi nếu đường dẫn không tồn tại.
💻 Bước 3: Viết Client để kiểm tra HTTP Server
Giờ hãy viết một client Python để gửi request đến server.
Client này giống như “trình duyệt” mini — nó sẽ gọi đến API mà bạn vừa tạo.
👉 Tạo file weather_client.py
# weather_client.py
import urllib.request
import json
BASE_URL = "http://127.0.0.1:5000"
# Lấy danh sách thành phố
with urllib.request.urlopen(f"{BASE_URL}/weather/cities") as response:
data = json.loads(response.read())
print("🌆 Danh sách thành phố:", data["cities"])
# Lấy thông tin thời tiết Tokyo
with urllib.request.urlopen(f"{BASE_URL}/get_weather?city=Tokyo") as response:
data = json.loads(response.read())
print("🌤️ Thời tiết Tokyo:", data["weather"])
▶️ Bước 4: Chạy thử
1️⃣ Mở terminal, chạy server:
python weather_server.py
Kết quả:
🚀 Server đang chạy tại: http://127.0.0.1:5000
2️⃣ Mở một terminal khác, chạy client:
🌆 Danh sách thành phố: ['Tokyo', 'New York', 'Paris', 'London']
🌤️ Thời tiết Tokyo: {'temp': 22, 'condition': 'Cloudy'}
🎉 Chúc mừng! Bạn vừa tự tay xây dựng một HTTP Server mini bằng Python — có thể xử lý request, trả response và mô phỏng API thực tế.
🧩 Mở rộng thêm
Giờ bạn đã có nền tảng, hãy thử:
- Thêm endpoint
/weather/allđể trả toàn bộ dữ liệu thời tiết. - Cho phép phương thức POST để thêm thành phố mới.
- Tích hợp với API thật như OpenWeatherMap.
- Dùng Flask hoặc FastAPI để viết lại phiên bản “chuyên nghiệp” hơn.
🚀 Kết luận
Bằng cách xây dựng HTTP Server bằng Python này, bạn đã hiểu sâu hơn cách:
- Trình duyệt và server trao đổi qua HTTP.
- Cấu trúc một API server đơn giản.
- Gửi và nhận dữ liệu JSON qua HTTP request/response.
Đây là bước khởi đầu tuyệt vời để bạn:
- Phát triển REST API thực tế,
- Học Flask hoặc FastAPI dễ dàng hơn,
- Và hiểu rõ cách các dịch vụ web hoạt động “dưới nắp capo”.


