TinCan/xAPI - запрос на возобновление работы не работает
Я создал свою собственную простую LMS в ColdFusion. Он просто использует iframe для отображения курса, и есть страница, на которой записаны операторы консервной банки. Он отлично работает, но у меня есть курс, разработанный в Studio '13/ Presenter '13, вывод tincan, что функция возобновления не работает на моей LMS.
Если я использую presentation.html, пример
https://www.domainname.com/folder/courses/example_course/presentation.html?&actor={"name":["My_Name"],"mbox":["mailto:email@email.com"],"objectType":["Agent"]}&endpoint=https://www.domainname.com/folder/courses/&course_id=5&uuid=9AE6DEA4-9C19-F477-19B9822F1E2F0722®istration=36fc1ee0-2849-4bb9-b697-71cd4cad1b6e&activity_id=https://www.domainname.com/folder/courses/&auth=Basic TG9naW46UGFzc3dvcmQ=
резюме не работает, но заявления Tincan отправляются на мой сайт должным образом.
Если я использую presentation_html5.html, пример
https://www.domainname.com/folder/courses/example_course/presentation_html5.html?&actor={"name":["My_Name"],"mbox":["mailto:email@email.com"],"objectType":["Agent"]}&endpoint=https://www.domainname.com/folder/courses/&course_id=5&uuid=9AE6DEA4-9C19-F477-19B9822F1E2F0722®istration=36fc1ee0-2849-4bb9-b697-71cd4cad1b6e&activity_id=https://www.domainname.com/folder/courses/&auth=Basic TG9naW46UGFzc3dvcmQ=
резюме работает, но заявления Тинкана не публикуются.
Я следовал руководству и настроил функцию возобновления: http://www.articulate.com/support/presenter-09/enabling-and-disabling-the-prompt-to-resume-function
Я пробовал курс на нескольких разных веб-сайтах на нескольких разных серверах и в нескольких разных браузерах (IE 11, FF 34.0.5, Chrome 39.0.2171.95 m), текущей версии Flash.
Функция возобновления не работает.
Я пробовал курс со всеми различными опциями, подсказками и т. Д., Флеш-куки включены и отключены.
Функция возобновления не работает.
Я пробовал курс по Scorm Cloud. Функция резюме работает! Я открыл презентацию.html на моем компьютере в FireFox. Функция резюме работает.
Я сузил вопрос до TinCan. Если я отключу TinCan в файле presentation.html, изменив
var g_bTinCan = true; to var g_bTinCan = false;
Курс возобновляется, как и должно быть. Но поскольку TinCan отключен, он не публикует никаких заявлений в моей LMS.
Я понял, что мне, вероятно, нужно ответить на состояние POST? Method=GET с данными состояния / возобновления. Так как то так
1Nk30a010904050607080b0on1001811f016110171101811000 (указывает курс на слайд 4 или что-то в этом роде).
Я понимаю, что данные закодированы / сжаты. Данные фактически поступают из данных о состоянии, опубликованных в СУО. Каждый слайд публикует точку возобновления. Я предполагаю, что мне просто нужно получить эти данные точек возобновления из предыдущего сеанса и отправить обратно, когда пользователь возобновит курс, и Tincan запросит данные возобновления.
Но по какой-то причине, независимо от того, что я возвращаю и как я это возвращаю. Мой курс просто сидит и загружается. Все есть, навигационная панель, дополнительные функции курса, кнопка выхода, только содержание имеет знак загрузки. Ничто не кликабельно.
Я попытался опубликовать похожие заголовки, которые использует облако scorm в ColdFusion:
Access-Control-Allow-Header: Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through
Access-Control-Allow-Origin: *
Access-Control-Expose-Header: ETag,Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json
X-Experience-API-Version: 1.0.0
access-control-allow-methods: HEAD,GET,POST,PUT,DELETE
Они правильно проходят вместе с ответом: 1Nk30a010904050607080b0on1001811f016110171101811000
Я пробовал формат возврата как JSON, простой текст, массив. Но курс не загружается. Я также обнаружил странное поведение, если я обновляюсь, а затем немедленно останавливаю браузер (курс никогда не обновляется). Появится запрос на возобновление, и затем я могу нажать Да / Нет. И это работает. Очевидно, что это не так.
Есть идеи? Что мне не хватает? Я ищу то, что ожидает курс Articulate в качестве ответа от моей (или любой) LMS/LRS, когда он запрашивает точку возобновления в состоянии? Method=GET.
редактировать
@Brian: тип контента это приложение / JSON
LRS должен возвращать Content-Type в том виде, в котором он был получен. Здесь все становится сложнее. state?method=GET перенаправляет в функцию cfc. ../includes/LRSCFC.cfc?method=GetState&returnFormat=plain
Это функция:
<cfheader name="Access-Control-Allow-Header" value="Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Expose-Header" value="Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Cache-Control" value="no-cache">
<cfheader name="Connection" value="keep-alive">
<cfheader name="Content-Type" value="application/json">
<cfheader name="X-Experience-API-Version" value="1.0.0">
<cfheader name="access-control-allow-methods" value="HEAD,GET,POST,PUT,DELETE">
<cfreturn '1s43040ji1001111a0101101111000'>
Проблема состоит в том, что если CF сказать, чтобы он возвращался как json, используя функцию returnFormat=json или serializeJSON(). Это добавляет вещи к возвращенным данным.
Код выше вернется:
1s43040ji1001111a0101101111000
говоря CF использовать json:
//"1s43040ji1001111a0101101111000"
Что является безопасной особенностью CF.
Но что смущает меня, так это то, что Scorm Cloud просто возвращается
1s43040ji1001111a0101101111000
Он не отформатирован как JSON. Кажется, что это простой текст, хотя Content-Type - это application/json.
Если я возвращаю всю информацию cfheader, но оставляю cfreturn пустым, cfreturn "", курс просто сидит там, как будто я возвратил "1s43040ji1001111a0101101111000"
1s43040ji1001111a0101101111000 - Should jump the user to slide 3.
Какой код статуса вы возвращаете?200 ОК
Любой другой статус, курс будет играть, но будет жаловаться, что не может подключиться к серверу.
@Эндрю
Есть ошибки, успехи, запросы в процессе? Нет ошибок Похоже, все успешно. нет запросов в процессе.
1 ответ
Я понял мою проблему. Мне не хватало Content-Length
в заголовках. Content-Length - это длина данных ответа. Итак, я добавил это:
<cfheader name="Content-Length" value="#len('1s43040ji1001111a0101101111000')#">
К моему текущему коду, вот так:
<cfheader name="Access-Control-Allow-Header" value="Content-Type,Content-Length,Authorization,If-Match,If-None-Match,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Expose-Header" value="Last-Modified,Cache-Control,Content-Type,Content-Length,WWW-Authenticate,X-Experience-API-Version,X-Experience-API-Consistent-Through">
<cfheader name="Cache-Control" value="no-cache">
<cfheader name="Connection" value="keep-alive">
<cfheader name="Content-Type" value="application/json">
<cfheader name="X-Experience-API-Version" value="1.0.0">
<cfheader name="access-control-allow-methods" value="HEAD,GET,POST,PUT,DELETE">
<cfheader name="Content-Length" value="#len('1s43040ji1001111a0101101111000')#">
<cfreturn '1s43040ji1001111a0101101111000'>