e读是中国高等教育文献保障系统CALIS提供的学术搜索引擎, 旨在整合全国高校纸本和电子资源, 为读者在海量的全国图书馆资源中提供检索服务。e读有4个方面的优势[ 1, 2]:收录了丰富的资源;便捷获取原文;提供了SaaS与API定制、分面浏览、输入提示、聚类检索等良好的用户体验;基于云的服务模式, 协助成员馆零投入建立电子图书馆。截止到2012年3月底, e读服务的成员馆数已经有800多家[ 1]。OPAC是图书馆揭示馆藏文献的重要途径之一, 传统的OPAC仅提供书目的详细信息已经无法满足读者浏览的需求。e读提供的目次、摘要、章节试读、电子资源全文阅读等服务正好弥补了OPAC这一缺陷, 丰富了OPAC的服务内容, 提升了图书馆的服务能力。
因此, 在深圳大学图书馆获批CALIS的“e读服务示范馆建设”项目这一契机下, 笔者基于e读的Open API, 在SULCMIS OPAC的书目详细信息页面集成了目次、摘要、章节试读、电子资源全文阅读、链接e读 (如果是期刊则链接到CALIS的外文期刊网CCC) 的功能, 为读者带来了便利。笔者对CALIS三期74家e读示范馆的OPAC
与e读集成的实践情况进行了调研 (有8家无法访问) , 其中通过ISBN的检索方式链接e读的有12家, 通过题名的检索方式链接e读的有21家, 直接能链接到e读提供的详细书目信息的有3家, 使用了e读的目次、摘要等服务的有2家 (湖南理工学院图书馆和深圳大学图书馆) , 只有深圳大学图书馆使用SULCMIS OPAC。
深圳大学图书馆基于多层MVC框架模式采用ASP.NET实现了新版本SULCMIS OPAC[ 3], 并于2009年1月1日正式对外发布。系统的详细书目信息页面不仅展示书目信息, 还展示了相关电子资源、藏书情况、读秀或Google提供的图书封面、二维码、借阅次数、评分、相关借阅、各种途径的扩展检索等信息, 却缺少对书目目次、摘要的揭示, 也没有提供试读及全文阅读的功能。为了更全面地揭示文献, 便于读者更好地利用书目, 迫切需要在OPAC中加入上述功能来满足读者的需求。
CALIS针对图书信息、期刊信息、期刊文章信息、学位论文信息在e读中提供了一系列的Open API[ 4], 其中图书信息包括封面、目次、摘要、试读链接、全文链接、图书在e读的详细信息页面地址。这些服务恰恰可弥补SULCMIS OPAC的不足之处, 是深圳大学图书馆解决OPAC无法更全面揭示文献的有效途径。在实践过程中, 笔者调用了“获取文本形式的目次”、“获取图书摘要”、“获取图书试读链接”、“获取图书全文链接”、“获取图书在e读的详细信息页面地址”这5个API。另外, 对期刊的处理不是使用e读的API, 而是通过ISSN直链到CALIS的外文期刊网CCC, 因此不在此处进行描述。
e读提供两种调用方式:基于CALIS控制号 (calis uuid) 和基于图书馆本地控制号调用。二者都必须使用CALIS基于授权的安全访问方式,本馆选用了后者。下面以“获取图书试读链接”API为例, 介绍调用的过程, 其他API的调用可以参考此过程及相关文档。“获取图书试读链接”基于图书馆本地控制号的调用地址为:
http://api.calis.edu.cn/book/sample/localid?calis_clientkey={client_key}&localid={local_id}&calis_parameters={calis_parameters}&calis_sign={calis_sign}
这里{client_key}是由CALIS分配给成员馆的client key, {local_id}是本地控制号, {calis_parameters}是用Base64对调用参数按一定格式加密后的结果, {calis_sign}是基于CALIS分配的client key及client secret对规定的参数进行Base64+MD5加密后的结果。API返回的是XML数据, 如图1所示:
在获得返回结果后, 可使用XPath解析。XML数据的查询早在2007年已经广泛应用[ 5], 因此在OPAC中解析e读API的返回结果是容易实现的。
在上述OPAC需求及e读调用分析的基础上, 笔者拟采用ASP.NET+XML调用e读API, 实现SULCMIS OPAC与e读的集成, 如图2所示:
图2中加粗边框的为SULCMIS OPAC需实现的模块。为方便其他使用SULCMIS OPAC的图书馆进行集成, 运用配置文件管理调用时使用的参数, 例如CALIS分配的{client key}、API的调用地址等。
页面部分的实现, 可采用Ajax把服务调用结果与书目信息页面一起呈现, 也可基于链接的方式进行呈现。前者可使用jQuery[ 6]或Prototype[ 7]实现。鉴于SULCMIS OPAC采用的JavaScript框架为Prototype, 如果采用jQuery, 两者都使用﹩符号会产生冲突, 需在引入jQuery的JavaScript后, 加上“var jQuery=﹩;”, 后面一律使用jQuery来代替﹩符号。本馆主要采用了基于链接的方式在书目信息页面bookinfo.aspx展示e读服务。读者点击链接时, OPAC会通过实现的e读API调用服务, 获取具体的e读信息。
综上所述, 总体的集成流程为:
(1) 参考《CALIS_API参考手册》[ 4], 在SULCMIS OPAC中实现calis_parameters和calis_sign的加密;
(2) 在SULCMIS OPAC中增加配置文件, 管理client key, client secret以及调用的API地址;
(3) 使用ASP.NET的HttpWebRequest、HttpWebResponse调用这些API, 最后采用XPath技术对返回结果进行解析;
(4) 在书目信息页面bookinfo.aspx中加入相应的HTML代码, 集成e读服务。
根据2.3节集成思路可知, 整个集成过程中服务端需在ASP.NET环境下使用加密、可配置、Open API调用、XML解析等技术, 页面端需加入相应的HTML代码, 下面以集成e读的试读服务为例, 介绍整个过程。
(1) 对calis_parameters和calis_sign进行加密。对calis_parameters的加密实现过程为:根据调用的API从配置文件中取得要加密的参数内容, 形成待加密串;使用Base64加密待加密串。calis_sign的加密实现过程为:对client_key、calis_parameters、client_secret按文档规定的格式进行字符串拼接, 形成待加密串;使用MD5加密待加密串;使用Base64加密上一步中的加密串。
(2) 使用ExeConfigurationFileMap从配置文件中读取试读API的地址, 并根据书目的本地控制号及加密后的calis_parameters和calis_sign形成具体的调用地址。整个集成的过程, 涉及参数有CALIS 为成员馆分配的client key及client secret、获取目次、摘要、试读、全文、e读链接等地址。因此采用ASP.NET中的配置文件技术*.config来管理这些参数, 方便其他图书馆进行配置。另外, e读API的返回结果中有三个特殊的地方:如果API返回的是在e 读中的地址, 那么地址前会显示“细览页面地址=”;如果返回的是试读的地址, 那么地址前会显示“试读=”;如果返回的是全文的地址, 那么地址前会显示“全文=”。所以也考虑把这三种情况通过配置文件管理, 整个配置文件如下:
…
…
(3) 使用ASP.NET提供的HttpWebRequest发起调用请求, HttpWebResponse获取响应并从中得到返回的数据流。由于返回的是XML数据, 可使用XmlDocument从数据流中读取, 并设定其内部的命名空间运用XPath获得相应的内容。
服务端实现试读API调用的关键代码如下:
①基于加密算法构造calis_parameters和calis_sign。
string calis_parameters = EDUEncrypt.encryptParameters (parameters) ;
string calis_sign = EDUEncrypt.encryptSign (sign) ;
②使用ExeConfigurationFileMap读取配置文件。
ExeConfigurationFileMap map = new ExeConfigurationFileMap () ;
map.ExeConfigFilename = Server.MapPath ("..\config\xxx.config") ; //设定配置文件路径
Configuration config = ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.None) ;//打开配置文件
③取得需要的参数。
AppSettingsSection appsetting = config.GetSection ("appSettings") as AppSettingsSection;
sample_book_url = appsetting.Settings["sample_url"].Value;
//取得调用的API地址
④构造具体的API调用地址。
string api_url = sample_book_url.Replace ("{clientkey}", client_key) .Replace ("{localid}", localid) .Replace ("{parameters}", calis_parameters) .Replace ("{sign}", calis_sign) ;
⑤创建HttpWebRequest对象, 发起请求。
HttpWebRequest req = (HttpWebRequest) WebRequest.Create (api_url) ;//创建HttpWebRequest对象
res = (HttpWebResponse) req.GetResponse () ;
//发起请求, 取得响应
⑥如果调用成功, 则获取响应流, 读取返回结果。
if (res.StatusCode == HttpStatusCode.OK) {//调用成功
Stream stream = res.GetResponseStream () ;
sr = new StreamReader (stream, System.Text.Encoding.GetEncoding ("utf-8") ) ;
samplecontent = sr.ReadToEnd () ;} //读取返回结果
⑦构建XmlDocument对象从字符串中读取XML。
XmlDocument xd = new XmlDocument () ;xd.LoadXml (toccontent) ;//从字符串中读取XML
⑧设定XML命名空间以及XPath。
XmlNamespaceManager nsp = new XmlNamespaceManager (xx.NameTable) ;
nsp.AddNamespace ("CALIS_book", "http://www.calis.edu.cn/metadata_ns/1.0/book/") ;//设定命名空间
XmlNode node = xx. SelectSingleNode ("CALIS_book:book/CALIS_book:extInfo/CALIS_book:calisSource", nsp) ;//XPath表达式
⑨对应用XPath后的检索结果进行处理。
if (node!=null) return node.InnerText.Replace (sample_url_prefix, "") ;
考虑到SULCMIS OPAC的书目详细信息页面已展示比较多的内容, 如果直接在页面上展示目次、摘要等信息, 会影响读者的体验, 因此采用直接增加链接的方式展示e读服务。打开OPAC目录下的bookinfo.aspx, 找到希望放置的位置, 加入如下代码, 并在OPAC的多语种配置文件中, 加入
读者在集成了e读服务的SULCMIS OPAC上访问图书的详细信息页面时, 可以看到“看目次”、“看摘要”、“试读”、“全文”、“链e读”等服务, 如图3所示:
点击这些服务后, 能获得相应的内容。具体效果可访问http://opac.lib.szu.edu.cn/opac/bookinfo.aspx?ctrlno=722654。实践证明, 在SULCMIS OPAC中应用e读, 完善了OPAC的服务内容, 让读者获得了更多的书目信息体验。
集成了高校所有资源的e读为各个图书馆带来了一种新的服务模式, 传统OPAC书目信息中缺少的内容可以由e 读通过Open API的方式集成到OPAC中。本文基于e读的API, 实现了SULCMIS OPAC与e读的集成, 加强了OPAC对书目的目次、摘要、章节试读、全文阅读等信息的展示, 使图书馆更好地为读者进行文献的揭示, 提升了图书馆的服务能力。其他使用SULCMIS OPAC的图书馆可以直接使用本文的实践来集成e读的服务。