Gọi endpoint có tham số đường dẫn và tham số truy vấn
Phần lớn endpoint vừa có tham số nằm trong đường dẫn (/items/{item_id}) vừa có tham số
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: python-basics, python-dictionaries.
Nội dung đề bài
Mô tả bài toán
Phần lớn endpoint vừa có tham số nằm trong đường dẫn (/items/{item_id}) vừa có tham số truy vấn (?q=...&limit=...). Muốn kiểm thử mà không cần mở cổng mạng, ta dùng TestClient của FastAPI: nó gọi thẳng ứng dụng trong cùng tiến trình và trả lại phản hồi đầy đủ, gồm cả mã trạng thái HTTP.
Yêu cầu
- Khai báo ứng dụng app với endpoint GET /items/{item_id} nhận item_id là số
nguyên, hai tham số truy vấn q (mặc định "none") và limit (mặc định 3).
- Nếu item_id < 1 thì trả lỗi 404 với phần thân {"detail": "not found"}.
- Nếu limit nằm ngoài đoạn [1, 10] thì trả lỗi 422 với phần thân
{"detail": "limit out of range"}.
- Trường hợp hợp lệ trả về {"item_id": item_id, "q": q, "limit": limit}.
- Viết hàm get_item(item_id, q="none", limit=3) dùng TestClient gọi endpoint, lấy
phần thân JSON của phản hồi, thêm khoá "status" bằng mã trạng thái HTTP rồi trả về dict đó.
Quy ước nộp bài
Nộp app và hàm get_item trong solution.py. Hệ thống gọi hàm trực tiếp theo tên đối số, so dict trả về với kết quả soạn tay; không đọc dữ liệu từ stdin và không in ra stdout.
Input
- item_id: số nguyên.
- q: chuỗi tham số truy vấn, mặc định "none", có thể là chuỗi rỗng hoặc chứa dấu cách.
- limit: số nguyên, mặc định 3.
Output
Dict phần thân JSON kèm khoá "status". Khi hợp lệ là {"item_id": ..., "q": ..., "limit": ..., "status": 200}; khi lỗi là {"detail": ..., "status": 404} hoặc {"detail": ..., "status": 422}.
Ràng buộc
- Phải đọc mã trạng thái thật từ phản hồi, không được giả định luôn là 200.
- Tham số truy vấn truyền qua params= của TestClient, không nối chuỗi vào URL.
- Hai biên limit = 1 và limit = 10 vẫn hợp lệ; ngoài đoạn đó mới là lỗi 422.
- Chỉ trả về dict; không trả về đối tượng phản hồi của Starlette.
Ví dụ 1
Input
get_item(item_id=7, q="tea")
Output
{"item_id": 7, "q": "tea", "limit": 3, "status": 200}
Ví dụ 2
Input
get_item(item_id=3, q="milk", limit=5)
Output
{"item_id": 3, "q": "milk", "limit": 5, "status": 200}
Giải thích
get_item(item_id=7, q="tea") gọi GET /items/7?q=tea&limit=3 và trả về {"item_id": 7, "q": "tea", "limit": 3, "status": 200}. get_item(item_id=0) trả về {"detail": "not found", "status": 404}.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
