2016-11-29 4 views
0

Мне нужно предоставить ряд веб-сервисов для доставки данных из приложения 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 
+0

Привет, Мартин, вы можете включить некоторые детали, например. Разметка xsp? код службы отдыха, URL-адрес, который используется для получения запроса –

+0

Мартин: Я рекомендую удалить код beforePageLoad и добавить его в функцию в одной из библиотек javascript на стороне сервера. Затем вызовите эту функцию из подпрограмм doGet остальных служб. – Newbs

ответ

0

Проблема заключалась в том, что свойства "doGet" были установлены на "вычислить на странице загрузки" а не «вычислять динамически». Не уверен, как это закралось - возможно, ошибка копирования и вставки.

+0

ах, что объясняет это! Мне было любопытно об этом поведении. не забывайте отмечать этот вопрос так, чтобы он не сидел без ответа навсегда –

Смежные вопросы