2016-11-29 20 views
0

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 
+0

こんにちはMartin、場合によってはいくつかの詳細を含めることができます。 xspのマークアップ? rest service code、取得リクエストに使用されているURL –

+0

Martin:beforePageLoadコードを削除し、それをサーバーサイドのJavaScriptライブラリの1つの関数に追加することをお勧めします。その後、残りのサービスのdoGetルーチンからその関数を呼び出します。 – Newbs

答えて

0

を使用して呼ばれています動的に計算するのではなく、それがどのようにうまくいっているかわからない - おそらくコピーと貼り付けのエラー。

+0

それを説明するああ!私はその行動が不思議でした。この質問に答えることを忘れないでください。そうすれば、永遠に未回答のままで座ることはありません –

関連する問題