Инструкция пакетной отправки стейтментов ЦС
Инструкция пакетной отправки стейтментов ЦС
Данные отправляются пакетно, а НЕ отдельно каждая запись ЦС.
Параметры отправки пакета: в 1 пакете 500 записей, интервал между отправкой каждого пакета - не менее 10 сек.
При получении любой ошибки при отправке пакета (400-е, 500-е) происходит переотправка пакета целиком.
Что такое пакет?
Пакет – это список из нескольких стейтментов (стейтмент – одна запись ЦС -json), который отправляется одним post-запросом.
Список указывается в квадратных скобках [], внутри этого списка через запятую указывается каждая отдельная запись ЦС в отдельном json в фигурных скобках {}.
В пакете могут быть шаблоны разного типа.
Пример:
[
{
"id": "4dbf15fc-1c46-46d0-952d-fce7978b7721",
"version": "1.0.3", // * Версия протокола xAPI (константа шаблона)
"timestamp": "2023-02-14T20:01:02+03:00", // * дата и время регистрации события (дата и время начала занятия)
"actor": { // * Описание учащегося
"objectType": "Agent", // * Тип объекта (константа шаблона)
"account": { // * IFI на платформе Университета
"homePage": "https://my.2035.university", // * Домашняя страница регистратора аккаунта (константа шаблона)
"name": "11111" // * UNTI ID Получателя поддержки
}
},
"verb": { // * Глагол
"id": "http://adlnet.gov/expapi/verbs/visited", // * Идентификатор глагола (константа шаблона)
"display": { // Отображаемые значения
"ru-RU": "Посетил занятие" // Отображаемое название на русском (константа шаблона)
}
},
"object": { // * Объект
"id": "ceb8350d-4c4d-4c05-913e-13fcc319b211", // * Идентификатор следа методиста,описывающий занятие
"objectType": "StatementRef" // * Тип объекта (константа шаблона)
},
"result": { // * Результат
"extensions": { // * Расширения
"https://id.2035.university/xapi/extension/start_datetime": "2023-09-14T20:01:02+03:00",// * дата и время начала занятия
"https://id.2035.university/xapi/extension/end_datetime": "2023-09-14T20:01:02+03:00",// * дата и время окончания занятия
"https://id.2035.university/xapi/extension/visit_status": "присутствовал", // * или " отсутствовал" статус посещения
"https://id.2035.university/xapi/extension/instructor": { // * Преподаватель
"objectType": "Agent", // Тип объекта (константа шаблона)
"account": { // * IFI
"homePage": "https://my.2035.university", // * Домашняя страница регистратора аккаунта (константа шаблона)
"name": "33333", // * UNTI ID ответственного за проверку или
"id_cat": "33333" // * ID преподователя из каталога (если нет UNTI ID, то указывать это поле)
}
},
"https://id.2035.university/xapi/extension/instructor_comment": "" // комментарий преподавателя (если есть)
}
},
"context": { // * Контекст
"extensions": { // * Расширения
"https://api.2035.university/project": "Код Будущего", // * ID проекта (константа) на платформе УНТИ 2035
"https://api.2035.university/parent_course_id": 12345, // * ID программы (курса) на платформе УНТИ 2035
"https://api.2035.university/level_id": "начальный", // * или "базовый"/"продвинутый"/"профессиональный" ID уровня на платформе УНТИ 2035. Передавать на руссуком языке и с маленькой буквы
"https://api.2035.university/flow_id": 234, // * ID потока на платформе УНТИ 2035
"https://api.2035.university/module_num": 1// * Порядковый номер модуля
}
}
},
{
"id": "50b6ff22-fa15-4541-85b0-6d0769969d59",
"version": "1.0.3", // * Версия протокола xAPI (константа шаблона)
"timestamp": "2023-09-14T20:02:02+03:00", // * дата и время регистрации события (дата и время начала занятия)
"actor": { // * Описание учащегося
"objectType": "Agent", // * Тип объекта (константа шаблона)
"account": { // * IFI на платформе Университета
"homePage": "https://my.2035.university", // * Домашняя страница регистратора аккаунта (константа шаблона)
"name": "11111" // * UNTI ID Получателя поддержки
}
},
"verb": { // * Глагол
"id": "http://adlnet.gov/expapi/verbs/visited", // * Идентификатор глагола (константа шаблона)
"display": { // Отображаемые значения
"ru-RU": "Посетил занятие" // Отображаемое название на русском (константа шаблона)
}
},
"object": { // * Объект
"id": "ceb8350d-4c4d-4c05-913e-13fcc319b211", // * Идентификатор следа методиста,описывающий занятие
"objectType": "StatementRef" // * Тип объекта (константа шаблона)
},
"result": { // * Результат
"extensions": { // * Расширения
"https://id.2035.university/xapi/extension/start_datetime": "2023-09-14T20:01:02+03:00",// * дата и время начала занятия
"https://id.2035.university/xapi/extension/end_datetime": "2023-09-14T20:01:02+03:00",// * дата и время окончания занятия
"https://id.2035.university/xapi/extension/visit_status": "присутствовал", // * или " отсутствовал" статус посещения
"https://id.2035.university/xapi/extension/instructor": { // * Преподаватель
"objectType": "Agent", // Тип объекта (константа шаблона)
"account": { // * IFI
"homePage": "https://my.2035.university", // * Домашняя страница регистратора аккаунта (константа шаблона)
"name": "33333", // * UNTI ID ответственного за проверку или
"id_cat": "33333" // * ID преподователя из каталога (если нет UNTI ID, то указывать это поле)
}
},
"https://id.2035.university/xapi/extension/instructor_comment": "" // комментарий преподавателя (если есть)
}
},
"context": { // * Контекст
"extensions": { // * Расширения
"https://api.2035.university/project": "Код Будущего", // * ID проекта (константа) на платформе УНТИ 2035
"https://api.2035.university/parent_course_id": 12345, // * ID программы (курса) на платформе УНТИ 2035
"https://api.2035.university/level_id": "начальный", // * или "базовый"/"продвинутый"/"профессиональный" ID уровня на платформе УНТИ 2035. Передавать на руссуком языке и с маленькой буквы
"https://api.2035.university/flow_id": 234, // * ID потока на платформе УНТИ 2035
"https://api.2035.university/module_num": 1// * Порядковый номер модуля
}
}
}
]
Если от сервера получен ответ 200, то в ответ будет прислан список uuid в том порядке, в котором идут записи.
1. Пример, когда получена ошибка 400 при отправке, то есть не пройдена спецификация xAPI:
[
{
"id": "4dbf15fc-1c46-46d0-952d-fce7978b7721",
"version": "1.0.3", // * Версия протокола xAPI (константа шаблона)
"timestamp": "2023-02-14T20:01:02+03:00", // * дата и время регистрации события (дата и время начала занятия)
…
"context": { // * Контекст
"extensions": { // * Расширения
"https://api.2035.university/project": "Код Будущего", // * ID проекта (константа) на платформе УНТИ 2035
"https://api.2035.university/parent_course_id": 12345, // * ID программы (курса) на платформе УНТИ 2035
"https://api.2035.university/level_id": "начальный", // * или "базовый"/"продвинутый"/"профессиональный" ID уровня на платформе УНТИ 2035. Передавать на руссуком языке и с маленькой буквы
"https://api.2035.university/flow_id": 234, // * ID потока на платформе УНТИ 2035
"https://api.2035.university/module_num": 1// * Порядковый номер модуля
}
}
},
{
"id": "50b6ff22-fa15-4541-85b0-6d0769969d59",
"version": "1.0.3", // * Версия протокола xAPI (константа шаблона)
"timestamp": "2023-09-14T20:02:02+03:00", // * дата и время регистрации события (дата и время начала занятия)
"actor": { // * Описание учащегося
"objectType": "Agent", // * Тип объекта (константа шаблона)
"account": { // * IFI на платформе Университета
"homePage": "https://my.2035.university", // * Домашняя страница регистратора аккаунта (константа шаблона)
"name": "11111" // * UNTI ID Получателя поддержки
}
},
"verb": { // * Глагол
"id": "http://adlnet.gov/expapi/verbs/visited", // * Идентификатор глагола (константа шаблона)
"display": { // Отображаемые значения
"ru-RU": "Посетил занятие" // Отображаемое название на русском (константа шаблона)
}
},
"object": { // * Объект
"id": "ceb8350d-4c4d-4c05-913e-13fcc319b211", // * Идентификатор следа методиста,описывающий занятие
"objectType": "Statement" // * Тип объекта (константа шаблона)
},
…
"context": { // * Контекст
"extensions": { // * Расширения
"https://api.2035.university/project": "Код Будущего", // * ID проекта (константа) на платформе УНТИ 2035
"https://api.2035.university/parent_course_id": 12345, // * ID программы (курса) на платформе УНТИ 2035
"https://api.2035.university/level_id": "начальный", // * или "базовый"/"продвинутый"/"профессиональный" ID уровня на платформе УНТИ 2035. Передавать на руссуком языке и с маленькой буквы
"https://api.2035.university/flow_id": 234, // * ID потока на платформе УНТИ 2035
"https://api.2035.university/module_num": 1// * Порядковый номер модуля
}
}
}
]
Ошибка в следе 50b6ff22-fa15-4541-85b0-6d0769969d59, в поле objectType указано Statement вместо StatementRef.
Ответ сервера в таком случае будет выглядеть так:
Обращаем внимание на поле "warnings", оно говорит о том, где ошибка: в каком по счету стейтменте (json) от начала списка (отсчет начинается с нуля 0,1,2). В данном случае – это первый (то есть второй фактически) и в каком поле, в данном случае object.
В случае ошибок сразу в нескольких стейтментах подсветится каждая ошибка. В данном случае в первом стейтменте ошибка в поле timestamp, во втором в поле object:
Исправляем все ошибки и отправляем весь пакет полностью.
2. Пример ошибки 409, то есть запись с таким uuid уже существует в базе:
При возникновении такой ошибки переотправляем весь пакет, убрав из него конфликтные uuid, либо заменив конфликтные uuid на новые.
3. При возникновении любой ошибки 500+ ничего не исправляем, просто переотправляем весь пакет.