​Инструкция пакетной отправки стейтментов ЦС

Инструкция пакетной отправки стейтментов ЦС

Данные отправляются пакетно, а НЕ отдельно каждая запись ЦС.

Параметры отправки пакета: в 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+ ничего не исправляем, просто переотправляем весь пакет.