






Preview text:
BÀI TẬP HTTP REQUEST
1 Phân tích đề bài và lựa chọn giải pháp
Đề bài yêu cầu viết chương trình thực hiện quy trình HTTP với 2 thao tác chính:
Client gửi POST lên /api/login với JSON body bao gồm username và password
Client gọi GET lên /api/profile để hiển thị thông tin tương ứng với người dùng đăng nhập
Tiêu chí hoàn thành bao gồm:
Endpoint /app/login nhận đúng Content-Type: application/json, xử lý
hợp lệ và phản hồi 200 kèm xác nhận đã login
Sau khi login, gọi /api/profile không cần gửi lại thông tin đăng nhập
mà vẫn trả về JSON profile đúng người dùng đăng nhập.
Giải pháp được sử dụng:
Framework FastAPI (chạy bằng Uvicorn) để định nghĩa 2 endpoint.
Cookie phiên client-side qua SessionMiddleware (Starlette): khi
login thành công, server ghi định danh vào request.session;
middleware tự động ký giá trị này bằng SECRET_KEY, /api/profile sẽ
đọc lại thông tin định danh ở request.session để nhận diện người gọi.
Nguồn dữ liệu lấy từ database SQLite để trả về thông tin profile.
Sử dụng Postman để kiểm thử
2 Chuẩn bị CSDL (SQLite)
Bảng users lưu hồ sơ tối thiểu để hiển thị khi đã đăng nhập.
student_id – khóa chính, định danh sinh viên (chuỗi).
password – mật khẩu demo dạng plain-text. full_name – họ tên.
gpa – điểm trung bình (số thực).
email – email (có thể để trống).
3 Định nghĩa API
3.1 POST /api/login
Chức năng: Nhận thông tin đăng nhập dạng JSON và thiết lập phiên
cho người dùng hiện tại và trả về thông báo đã đăng nhập. Yêu cầu gọi
Header: Content-Type: application/json Body (JSON): { "username": "B22DCAT056", "password": "123456" }
Phản hồi tiêu biểu
200 OK + body {"detail": "logged in"}. Kèm header Set-Cookie:
session=...; HttpOnly; Path=/; SameSite=lax (Postman sẽ tự lưu cookie).
Lỗi: 401 Invalid credentials khi sai cặp username/password; 422
nếu JSON thiếu trường hoặc sai kiểu. 3.2 P OST / api/pr ofile
Chức năng. Trả về hồ sơ của chính người dùng đang đăng nhập. Yêu cầu gọi
Không cần gửi lại username/password; client gửi cookie session đã nhận từ bước login.
Phản hồi tiêu biểu 200 OK + body: { "student_id": "B22DCAT056", "full_name": "Lê Anh Duy", "gpa": 0.0, "email": null }
Lỗi: 401 Not logged in nếu thiếu/không hợp lệ cookie phiên; 404
User not found nếu phiên trỏ tới tài khoản không tồn tại. 4 Kiểm thử
4.1 POST /api/login
4.1.1 Đăng nhập thành công
Chuẩn bị. Chọn một tài khoản hợp lệ, ví dụ B22DCAT056 / 123456. Thao tác.
POST http://127.0.0.1:8000/api/login Body → raw → JSON:
{"username":"B22DCAT056","password":"123456"}
Kết quả mong đợi (Pass). HTTP 200, body: {"detail":"logged in"}
Header có Set-Cookie: session=...; HttpOnly; SameSite=lax. Postman Cookie
Jar xuất hiện cookie session. 4.1.2 Đăng nhập sai mật khẩu Thao tác. POST
/api/login với JSON sai mật khẩu:
{"username":"B22DCAT056","password":"sai"}
Kết quả mong đợi (Pass). HTTP 401, body:
{"detail":"Invalid credentials"} Không set cookie mới. Ádsdasd