XPage 上的多个 REST 服务控件

Multiple REST service controls on XPage

我需要提供一些 Web 服务来将 Notes 应用程序的数据提供给外部网站。

我创建了一个具有多个自定义 REST 服务控件的 XAgent。每个控件都有自己的 "pathInfo" 属性 和代码定义在 "doGet" 到 return 一个 JSON 包含网站所需的相关数据的对象。

这一切都很好,正确的数据是通过调用每个网络服务 return 编辑的。但是,在向每个 "doGet" 添加了一些调试消息后,我看到 XPage 上的 所有 服务都由对其中任何一个的调用触发。

我在同一个 XPage 上有几个额外的 REST 服务控件,代码在 "doPost" 中定义,网站使用这些控件在 Notes 数据库中创建记录。这也适用于预期的结果,但调试消息显示,当调用其中一项服务时,所有 "get" 服务也会被触发。

知道这里发生了什么吗?我可以为每个 REST 服务控件创建一个单独的 XAgent,但如果没有必要,这似乎有点过分了。

更新

这是 XPage 的缩减版本,只有两个 "get" 服务。调用这些服务中的哪一个并不重要,日志消息显示首先触发 getHospitals,然后是 getCustomerTypes。但是,正确的结果集总是 returned.

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex"
rendered="false">

<xp:this.beforePageLoad><![CDATA[#{javascript:var vwSettings:NotesView = database.getView("vwSettings");
var docSettings:NotesDocument = vwSettings.getFirstDocument();
sessionScope.put("App_DbPath", docSettings.getItemValueString("App_DbPath"));
sessionScope.put("WR_DbPath", docSettings.getItemValueString("WR_DbPath"));
sessionScope.put("logActivity", true);}]]></xp:this.beforePageLoad>
<xp:this.resources>
    <xp:script src="/Utils.jss" clientSide="false"></xp:script>
    <xp:script src="/OpenLogXPages.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xe:restService id="restService1" pathInfo="getHospitals">
    <xe:this.service>
        <xe:customRestService contentType="application/json"
            requestContentType="application/json" requestVar="hospital">
            <xe:this.doGet><![CDATA[${javascript:try {
if (sessionScope.logActivity == true) {
    log.logEvent("getHospitals");
}

var dbApp:NotesDatabase = sessionAsSigner.getDatabase(database.getServer(), sessionScope.App_DbPath);

var vwHospitals:NotesView = dbApp.getView("vhospitals.by.name");
var vecHospitals:NotesViewEntryCollection = vwHospitals.getAllEntries();

var eHospital:NotesViewEntry = vecHospitals.getFirstEntry()

var arrHospitals = new Array();

while (eHospital != null) {
    var hospital = {};
    hospital["Name"] = eHospital.getColumnValues()[0];
    hospital["HCode"] = eHospital.getColumnValues()[1];

    arrHospitals.push(hospital);

    eHospital = vecHospitals.getNextEntry(eHospital);
}

log.logEvent("getHospitals - END");

return toJson(arrHospitals);

} catch(e) {
   log.logError(e.toString());
}}]]></xe:this.doGet>


        </xe:customRestService>
    </xe:this.service>
</xe:restService>

<xe:restService id="restService2" pathInfo="getCustomerTypes">
    <xe:this.service>
        <xe:customRestService contentType="application/json"
            requestContentType="application/json">
            <xe:this.doGet><![CDATA[${javascript:try {
if (sessionScope.logActivity == true) {
    log.logEvent("getCustomerTypes");
}

var dbApp:NotesDatabase = sessionAsSigner.getDatabase(database.getServer(), sessionScope.App_DbPath);

var vw:NotesView = dbApp.getView("vkeywords");
var vec:NotesViewEntryCollection = vw.getAllEntriesByKey("Customer Type");

var e:NotesViewEntry = vec.getFirstEntry()

var arrItems = new Array();

while (e != null) {
    var item = {};
    item["CustomerType"] = e.getColumnValues()[1];

    arrItems.push(item);

    e = vec.getNextEntry(e);
}

log.logEvent("getCustomerTypes - END");

return toJson(arrItems);

} catch(e) {
    log.logError(e.toString());
}}]]></xe:this.doGet>


        </xe:customRestService>
    </xe:this.service>
</xe:restService>

服务调用使用

https://<<domain name>>/<<path name>>/ws.nsf/test.xsp/getHospitals

https://<<domain name>>/<<path name>>/ws.nsf/test.xsp/getCustomerTypes

问题是 "doGet" 属性设置为 "compute on page load" 而不是 "compute dynamically"。不确定它是如何出现的 - 可能是复制和粘贴错误。