我在这里: 首页 » SCORM标准基础知识 » 浏览文章: SCORM API详述 
« SCORM标准中找API_1484_11方法(xtqgbusr)ADLPhotoshopSCORM教程实例策略说明 »

SCORM API详述

2.2.1 API概述
SCORM描述了内容与LMS沟通的IEEE P1484.11.2-2003学习技术标准—ECMAScript应用编程接口,LMS是控制和传递学习内容的软件,它提供资源分配、时序安排、输入输出控制和数据管理。API通过一些使用ECMAScript语言编写的API服务实现LMS与学习内容之间的数据沟通。通用API的使用能够满足SCORM对互操作和重用的高水平要求,为SCO和LMS之间的沟通提供标准的方法,避免SCO开发者设计专门的沟通方法。下图是API相关的三个术语:

A、API是定义的一些函数;
B、API执行是功能软件的一部分,它执行和暴露API函数。API执行使用相同的公共接口并遵守接口的语义,使API执行功能不与SCO的开发相关。LMS只需要提供API执行来执行API的功能并将它的公共接口暴露给客户端SCO。
C、API实例是一个单独的执行情况和API执行状态。API实例代表在SCO操作中与SCO交互的执行软件的一部分。

API的关键作用是提供SCO和LMS的沟通机制。SCO运行之后便可以向LMS存储和获取信息。LMS和SCO之间的所有信息传递都由SCO发起,现在没有支持LMS调动SCO执行函数的机制。
API执行有三种函数,如下表所示:

函数 描述
Session Methods(会话函数) 用于通过API实例标记SCO和LMS之间communication session的开始和结束。
Data-transfer Methods(数据传递函数) 用于通过API实例交换SCO和LMS之间的数据模型值。
Support Methods(支持函数) 用于通过API实例辅助SCO和LMS之间传递信息。

2.2.2 API函数和语法

为使SCO能够在不同的LMS上运行且能够与LMS进行数据互换,必须对API做一些规定。API必须遵守的通用要求有:
 所有函数的名字是醒目而且要准确表示;
 所有函数的参数或幅角函数要区分大小写;
 所有作为参数传递的数据应该是一个字符串。
API的主要任务是实现SCO和LMS沟通。SCO运行之后就可以与LMS交换(获取或设置)信息。所有API实例和SCO之间的沟通都是由SCO发起的。或者说,SCO总是调用LMS的API实例的函数,LMS不能调用SCO定义的任何函数。这样就不会和API实例返回的值相混淆。这完全是对由SCO发起的调用的反映。现在还没有支持LMS发起调用SCO执行的函数的机制。
下面详细介绍API函数:
2.2.3 Session函数
SCO使用session函数初始化或终止它与API实例之间的数据沟通。
Initialize()用于初始化communication session,允许LMS处理特殊的初始化操作。
Terminate()用于结束communication session,Terminate()函数仍然延续SCO 前面Initialize(“”) 或Commit(“”)设置的所有数据,这样保证了SCO在LMS上连续运行。一旦communication session结束了,SCO就只能调用支持函数了。
2.2.4 Data-Transfer(数据传递)函数
SCO使用数据传递函数来存储和获取当前communication session中使用的数据。SCO使用这些函数将运行时间数据传输给LMS或从LMS获取。例如,LMS可以使用这个数据来帮助确定活动的完成/掌握,并且做出排序和导航的决定。
GetValue(parameter) 用于向LMS请求信息。SCO通过向LMS 请求信息来确定:
LMS支持的数据模型元素的值
LMS支持的数据模型的版本
是否支持特殊的数据模型元素
SetValue(parameter_1, parameter_2) 用于将LMS中parameter_2的值设置为parameter_1。SCO通过这个函数向LMS发送并存储信息。可以将API实例设计成在服务器端存储数据,也可以将数据存储在本地(客户端)。
Commit(parameter)用于SCO提交上次Initialize(“”)或Commit(“”)之后的连续数据,LMS将错误代码设置为“0”(没有错误发生),并返回“True”。如果API实例不缓存值,Commit(“”) 就返回 “ true ”,并设置错误代码为“0”(没错误发生),然后处理其他进程。由于提交数据函数的调用,缓存数据不能改变。例如,如果SCO设置了一个数据模型元素的值,就调用提交数据函数,接着再获取这个数据模型元素的值,返回值应该是调用提交数据函数之前的值。Commit(“”)函数可以作为SCO的预防机制,用来保证由于communication session 中断、不正常结束或在调用Terminate(“”)之前就结束等导致SetValue()设置的值丢失之后能够还原。

2.2.5 Support(支持)函数
API中Support函数使SCO能够确定错误处理和诊断信息。使用上面的API函数有可能会出现错误。这时就调用support 函数获得错误代码来显示遇到的错误。support 函数的调用不影响错误状态。
GetLastError() 可获取API实例当前错误状态的错误代码。SCO调用这个函数时,API实例不会改变当前的错误状态,只是返回错误信息。通常用GetLastError()来查看Session 函数或 Data-transfer函数是否调用成功,返回错误代码。

GetErrorString(parameter) 用于获取当前错误状态的描述性信息。SCO用它来获取错误代码为parameter的描述性信息。API实例支持错误代码的识别。这个函数的调用不影响错误状态,只是返回错误状态的描述信息。
GetDiagnostic(parameter)是专门为LMS所用的,它允许LMS通过API实例定义额外的诊断信息。它的调用不影响当前错误的状态,只是返回请求的信息。

2.2.6 Communication Session状态模型
IEEE定义了API实例在他存在期间变化的概念状态模型。下图描述了一个SCO运行时API 实例的变化状态。API实例的状态指出API 实例对应于特殊事件的转换。每个定义的API 实例状态定义了SCO可以调用的函数。API实例遇到的状态定义为:
•Not Initialized(未初始化)
•Running(运行中)
•Terminated(结束)
注:执行不要求执行一个状态模型。状态模型只是一个用于帮助说明在特殊沟通session 中API函数预定的动作的概念模型。


2.2.7 LMS的职责
SCORM要求LMS提供IEEE标准和SCORM定义的API 实例,减少SCO开发执行的难度。SCORM要求LMS提供的API实例可以执行前面提到的对API要求的功能。为了使SCO使用LMS提供的API实例,对LMS在什么地方以及如何提供API实例的访问也有要求。为了提供互操作的方法来定位API实例,LMS的API实例必须可以通过DOM“API_1484_11”访问。LMS必须为SCO提供通过ECMAScript访问API实例的功能。
为了能让SCO找到LMS提供的API实例,LMS要能在特殊的DOM层级运行SCO。LMS窗口的子窗口或子框架包含了API实例, LMS就能在客户端窗口中运行SCO。
2.2.8 SCO的职责
所有的SCO在通过API传递信息时都必须始终能够找到API实例。因此必须限制在DOM层级中LMS提供API实例的位置并且API实例有统一的名字。如果允许API实例存在于DOM层级的任何地方,将会很难提供一致的沟通机制和运行时间环境管理。
寻找API实例
为了使SCO开始在LMS中跟踪学习者的学习体验,SCO必须能够找到LMS提供的API实例。因为SCORM环境中的内容对象是在网络客户端运行的,网络客户端提供一个放置API实例的DOM。DOM可以认为是页面中对象的一个定义了的结构或组织。为了使SCO能够在不同的LMS中找到API实例,IEEE标准限制了API实例可以存在的层级。这个重要的事实是SCO必须在下面的位置查找API实例:
1、当前窗口的母链中,如果存在的话,直到到达母链的顶层窗口
2、开启窗口,如果有的话
3、开启窗口的母链,如果有的话,直到到达母链的顶层窗口。
SCO必须以这种方法查找API实例,并且一旦找到API实例就停止。为了使SCO知道查找什么,IEEE标准也定义了和API执行相关的DOM中对象的必须用的名字。API执行定义的名字是API_1484_11.


一旦SCO找到了API实例, SCO至少要调用Initialize(“”)和Terminate(“”) API。
IEEE标准提供了一些简单的ECMAScript来以一致的方式找到API实例。没有要求必须使用ECMAScript代码。其他的也可以。


var nFindAPITries = 0;
var API = null;
var maxTries = 500;
var APIVersion = "";
function ScanForAPI(win)
{
while ((win.API_1484_11 == null) && (win.parent != null) && (win.parent != win))
{
nFindAPITries++;
if (nFindAPITries > maxTries)
{
alert("Error in finding API instance -- too deeply nested."); return null;
}
win = win.parent;

}
return win.API_1484_11;
}


function GetAPI()
{
if ((win.parent != null) && (win.parent != win))
{
API = ScanForAPI(win.parent);
}
if ((API == null) && (win.opener != null))
{
API = ScanForAPI(win.opener);
if (API != null)
{
APIVersion = API.version;
}
}
}
使用要求和指南
SCO的构建方式多种多样,所以在开发SCO时需要考虑设计SCO如何在LMS中传递,并且学习者可能以不同的方式与SCO交互。例如,有些SCO是一些页面的集合,允许内部页面间的导航。这种设计,一些内容开发者可能只在首页调用Initialize(“”),在尾页调用Terminate(“”)。如果学习体验中意外情况发生的话将会怎样?意外情况可能是以下类型:
意外退出
用户故意的行为
突然终止
如果在调用Terminate()函数之前调用了Initialize(“”)但是不能调用Terminate()函数时,LMS就可以通过模拟函数的效果处理这些不同的假定情况,。这样做是由于没有办法知道问题的原因——是意外,有意的动作,或只是SCO的错误?当然,如果发生突然事件(断线或掉线)就可以将在服务器端缓存的数据通过Commit(“”)函数提交。

在API中使用Commit(“”)就是为了减少客户端和服务器之间信息传递的延迟,保证要传递的每个数据元素的值都能实时更新。API执行提供客户端缓存,当调用了Commit(“”)函数时就传递并保持数据状态。
为减少意外行为或问题的出现,SCO开发者应该遵守以下建议:
需要记录信息时调用Commit(“”)
在SetValue()之后不要调用Commit(“”)
在Terminate(“”)之前调用Commit(“”)没有什么作用
在调用Terminate(“”)之前,SCO应该注意是否成功调用Terminate(“”)
在communication session期间使用SetValue()和Commit(“”),而不是在Terminate(“”)之前


============================
文章来自http://spaces.msn.com/members/cmg7758/PersonalSpace.aspx?_c01_blogpart=blogmgmt&_c=blogpart
  • 相关文章
  • quote 1.李
  • 我在建行学习网站进行网上学习时,打开课程后提示"getAPI:Unable to find an LMS API adapter"而无法继续,请指教,盼复,谢谢!
  • 2006-11-27 22:35:44 回复该留言
  • quote 3.hawk
  • 你的建行网址是什么可否告知?
  • 2006-11-28 10:33:22 回复该留言
  • quote 4.ljj
  • 感谢可木老师提供这个学习SCORM的平台,我也是正在因写毕业论文而用到SCORM规范,但对SCO寻找实例中所说的由LMS提供,而且什么是窗口和子窗口不理解,能不能解释一下
  • 2010-7-27 19:58:35 回复该留言

发表评论

为了防止SPAM,含链接的评论需要审核后才能显示。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。