BÀI TẬP HTTP REQUEST
1 Phân tích đề i 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
Endpoint /app/login nhận đúng Content-Type: application/json, xử lý
hợp lệ 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
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ồ 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 thiết lập phiên
cho người dùng hiện tại 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ồ 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 session đãgửi cookie
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ệ, 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 . Postman Cookie Set-Cookie: session=...; HttpOnly; SameSite=lax
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

Preview text:

BÀI TẬP HTTP REQUEST
1 Phân tích đề bài 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