2016-11-29 1 views
0

Je dois fournir un certain nombre de services Web pour fournir des données d'une application Notes à un site Web externe.Plusieurs contrôles de service REST sous XPage

J'ai créé un XAgent avec plusieurs contrôles de service REST personnalisés. Chaque contrôle a sa propre propriété "pathInfo" et le code défini dans "doGet" pour renvoyer un objet JSON contenant les données pertinentes requises par le site Web.

Tout cela fonctionne bien et les données correctes sont renvoyées par des appels à chaque service Web. Cependant, après avoir ajouté des messages de débogage à chaque "doGet", je vois que tous les services sur la XPage sont déclenchés par un appel à l'un d'entre eux.

J'ai quelques commandes de service REST supplémentaires sur la même XPage avec le code défini dans "doPost", utilisé par le site Web pour créer des enregistrements dans la base de données Notes. Cela fonctionne également bien avec les résultats souhaités, mais les messages de débogage montrent que lorsqu'un appel à l'un de ces services est effectué, tous les services "get" sont également déclenchés.

Une idée de ce qui se passe ici? Je pourrais créer un XAgent séparé pour chaque contrôle de service REST, mais il semble trop lourd si ce n'est pas nécessaire.

MISE À JOUR

Voici une version réduite de la XPage avec seulement deux des services « get ». Peu importe lequel de ces services est appelé, les messages du journal montrent que getHospitals est d'abord déclenché suivi de getCustomerTypes. Cependant, le jeu de résultats correct est toujours renvoyé.

<?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> 

Et les services sont appelés à l'aide

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

et

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

Salut Martin, il est possible que vous incluiez quelques détails, par ex. Balise xsp? code de service de repos, l'URL utilisée pour obtenir la requête –

+0

Martin: Je vous recommande de supprimer le code beforePageLoad et de l'ajouter à une fonction dans l'une des bibliothèques javascript côté serveur. Appelez ensuite cette fonction à partir des routines doGet des services de repos. – Newbs

Répondre

0

Le problème est que les propriétés "doGet" ont été réglées sur "calculer la charge de la page" plutôt que de "calculer dynamiquement". Je ne sais pas comment cela s'est glissé - probablement une erreur de copier-coller.

+0

Ah ça l'explique! J'étais curieux de ce comportement. ne pas oublier de marquer cette question répondu de sorte qu'il ne reste pas assis comme sans réponse pour toujours –