Notesアプリケーションから外部Webサイトにデータを提供するために、いくつかのWebサービスを提供する必要があります。XPageで複数のRESTサービスコントロール
複数のカスタムRESTサービスコントロールでXAgentを作成しました。各コントロールには、独自の "pathInfo"プロパティと "doGet"で定義されたコードがあり、Webサイトで必要な関連データを含むJSONオブジェクトを返します。
これはすべて正常に動作し、各Webサービスへの呼び出しによって正しいデータが返されます。しかし、各 "doGet"にいくつかのデバッグメッセージを追加したところ、すべて XPage上のサービスは、いずれかの呼び出しによってトリガされています。
私は、Notesデータベースにレコードを作成するためにウェブサイトで使用される "doPost"で定義されたコードを使用して、同じXPage上にいくつかのRESTサービスコントロールを追加しました。これはまた、望ましい結果とうまくいくが、デバッグメッセージは、これらのサービスの1つへの呼び出しが行われると、すべての「取得」サービスもトリガされることを示している。
ここで何が起こっているのでしょうか?各RESTサービスコントロールごとに個別のXAgentを作成することもできますが、必要がなければ過度の負荷がかかるようです。
UPDATEここ
は「取得」サービスの2つだけとの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>
およびサービスは、問題は "doGetメソッド" プロパティ "は、ページの読み込みに計算する" に設定されたということでした
https://<<domain name>>/<<path name>>/ws.nsf/test.xsp/getHospitals
と
https://<<domain name>>/<<path name>>/ws.nsf/test.xsp/getCustomerTypes
こんにちはMartin、場合によってはいくつかの詳細を含めることができます。 xspのマークアップ? rest service code、取得リクエストに使用されているURL –
Martin:beforePageLoadコードを削除し、それをサーバーサイドのJavaScriptライブラリの1つの関数に追加することをお勧めします。その後、残りのサービスのdoGetルーチンからその関数を呼び出します。 – Newbs