Мне нужно предоставить ряд веб-сервисов для доставки данных из приложения Notes на внешний веб-сайт.Несколько элементов управления REST на XPage
Я создал XAgent с несколькими пользовательскими элементами управления REST. Каждый элемент управления имеет свое собственное свойство pathInfo и код, определенный в «doGet», чтобы вернуть объект JSON, содержащий соответствующие данные, требуемые веб-сайтом.
Все это работает хорошо, и правильные данные возвращаются вызовами каждой веб-службы. Однако, добавив некоторые отладочные сообщения в каждый «doGet», я вижу, что все службы в XPage запускаются вызовом любому из них.
У меня есть несколько дополнительных элементов управления REST на одном XPage с кодом, определенным в «doPost», который используется веб-сайтом для создания записей в базе данных Notes. Это также хорошо работает с желаемыми результатами, но сообщения отладки показывают, что при вызове одной из этих служб все службы «get» также запускаются.
Любая идея, что здесь происходит? Я мог бы создать отдельный XAgent для каждого элемента управления REST, но это кажется излишним, если это не обязательно.
UPDATE
Вот вырубить версия XPage только с двумя «получить» услуги. Не имеет значения, какая из этих служб вызывается, сообщения журнала показывают, что сначала запускается getHospitals, а затем getCustomerTypes. Однако правильный возвращаемый результат всегда возвращается.
<?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
Привет, Мартин, вы можете включить некоторые детали, например. Разметка xsp? код службы отдыха, URL-адрес, который используется для получения запроса –
Мартин: Я рекомендую удалить код beforePageLoad и добавить его в функцию в одной из библиотек javascript на стороне сервера. Затем вызовите эту функцию из подпрограмм doGet остальных служб. – Newbs