python-273Đọc toàn bộ đề miễn phí

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ố

PythonCơ bản15 phút

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ủ đề

fastapitestclientpath-parametersquery-parametersentry-ramp

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}.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.

Nhóm Zalo