Bỏ qua, đến nội dung

Tổng quan API của cổng

API JSON để hệ thống không dùng OneRoster đọc và gửi sinh viên, đợt thực tập, ghi danh.

Không phải hệ thống nào của trường cũng hỗ trợ OneRoster. API của cổng (v1) là một API REST JSON đơn giản để phần mềm của trường đọc và gửi dữ liệu thực tập: sinh viên, đợt thực tập, ghi danh vào đợt, khoá tài khoản; đọc kết quả thực tập và doanh nghiệp đã duyệt. API này cũng nhận gói CSV OneRoster cho trường xuất được gói nhưng không có API OneRoster.

Hệ thống đã hỗ trợ OneRoster 1.2 thì nên dùng API OneRoster để đọc. Hai API dùng chung kết nối, quyền và giới hạn.

Đặc điểm chính

  • Địa chỉ gốc: https://<trường>.<tên-miền-nền-tảng>/integration/v1. Trường được xác định theo tên miền; mã của trường nào chỉ dùng được ở trường đó.
  • Định dạng: JSON UTF-8. Thời điểm theo ISO 8601 (UTC); ngày (startDate, endDate) dạng YYYY-MM-DD theo giờ Việt Nam.
  • Lỗi: theo Problem Details (RFC 9457), kiểu application/problem+json. Xem Giới hạn và lỗi.
  • Đặc tả máy đọc được: OpenAPI 3.1 tại /integration/v1/openapi.json.

Xác thực

Mọi lời gọi gửi tiêu đề Authorization: Bearer <mã>. Nhà trường tạo kết nối ở trang Kết nối hệ thống và chọn một trong hai loại:

Loại kết nốiCách dùngPhù hợp
Mã truy cậpMột mã dạng ttdn_pat_... gửi thẳng trong mỗi lời gọi. Có thể đặt thời hạn (30, 90, 180, 365 ngày) hoặc không hết hạn.Hệ thống đơn giản, kịch bản đồng bộ
Mã ứng dụng và khoá bí mậtLấy mã 1 giờ ở /oauth/token theo OAuth 2.0 Client Credentials, như OneRoster.Hệ thống đã quen OAuth 2.0
curl -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://<trường>.<tên-miền-nền-tảng>/integration/v1/seasons"
  • Thay khoá: nhà trường bấm Thay khoá để cấp mã (hoặc khoá bí mật) mới; mã cũ còn dùng được 24 giờ để kịp đổi.
  • Thu hồi: ngừng ngay mọi mã của kết nối; không hoàn tác được.
  • Giới hạn địa chỉ: nếu nhà trường nhập danh sách địa chỉ mạng (IPv4/IPv6, nhận dạng CIDR như 203.0.113.0/24), lời gọi từ địa chỉ khác bị từ chối với 403.

Mã truy cập và khoá bí mật chỉ hiện một lần lúc tạo. Lưu ở biến môi trường hay kho khoá, không đưa vào mã nguồn, không gửi qua tin nhắn không mã hoá.

Quyền

Quyền (scope)Cho phép
students:readĐọc sinh viên
students:writeThêm, sửa, khoá, mở khoá sinh viên
seasons:readĐọc đợt thực tập
seasons:writeTạo, cập nhật đợt theo kỳ của hệ thống trường
enrollments:readĐọc sinh viên trong đợt
enrollments:writeĐưa sinh viên vào đợt
results:readĐọc kết quả thực tập
companies:readĐọc doanh nghiệp đã duyệt trong đợt
imports:writeGửi gói CSV OneRoster

Theo dõi việc xử lý (/jobs/...) cần một trong các quyền ghi: students:write, enrollments:write, imports:write. Thiếu quyền trả 403 kèm tên quyền cần.

Quy ước chung

Phân trang

Danh sách dài (/students, /seasons/{id}/enrollments, /seasons/{id}/results) trả từng trang:

  • limit: 1 đến 500, mặc định 100.
  • Thân phản hồi có next: chuỗi con trỏ của trang sau, hoặc null khi hết. Gửi lại bằng ?cursor=<next> cùng các tham số cũ.
  • Tiêu đề Link: <...>; rel="next" (RFC 8288) chứa sẵn địa chỉ trang sau.

Đồng bộ phần thay đổi

GET /students?updatedSince=2026-11-01T00:00:00Z chỉ trả sinh viên có thay đổi từ thời điểm đó. Lưu thời điểm bắt đầu mỗi lần đồng bộ rồi dùng cho lần sau.

Chạy thử

Mọi lệnh ghi nhận ?dryRun=true: cổng kiểm tra và trả kết quả như thật nhưng không lưu gì.

Gửi lại an toàn

Lệnh gửi theo lô (POST) nhận tiêu đề Idempotency-Key (1 đến 255 ký tự, nên dùng UUID). Gửi lại cùng khoá trong 24 giờ thì nhận lại đúng phản hồi lần đầu (kèm Idempotent-Replayed: true), không tạo việc mới. Cùng khoá mà nội dung khác thì bị từ chối (422).

Định danh

  • Sinh viên được nhận ra theo mã sinh viên (studentCode, không phân biệt hoa thường).
  • externalId (tuỳ chọn, tối đa 128 ký tự) là mã của bản ghi trong hệ thống của trường. Gửi kèm thì lần sau cổng nhận ra sinh viên theo mã này trước, rồi mới tới mã sinh viên, rồi email.
  • Đợt thực tập có id do cổng cấp và externalId là mã kỳ học bên hệ thống trường.

Các nhóm điểm truy cập

NhómTrang
Đọc đợt, sinh viên, ghi danh, kết quả, doanh nghiệpĐọc dữ liệu
Gửi đợt, sinh viên, ghi danh, khoá; theo dõi việc xử lýGửi dữ liệu
Gửi gói CSV OneRosterGói CSV OneRoster

Trong trang này