2014-09-30 36 views
0

我需要通過URL引用JSON-RPC方法,並且想知道如何執行或者如果可以。使用jQuery通過URL調用JSON-RPC方法

我想這樣做,因爲我想使用jQuery.deferred()在$ .post中進行調用。看看這個例子,看看我正在努力完成什麼。我想用我的RPC方法替換「/ echo/html /」。如果我不得不將我的RPC重寫爲XAgent,但我寧願先看看是否有人知道如何通過URL調用它。

我的RPC方法如下所示:openATMRPC.openATMFirst();它使用傳統的JavaScript工作得很好,但正如你所看到的,我希望它鏈接在jQuery延遲函數中,以便運行.always。

var deferred = function(trueFalse) { 
    // return value from response as `deferred.promise` 
    // within `setTimeout` , after `1000` ms (one second) 
    return new $.Deferred(function (dfd) { 
    setTimeout(function() { 
     $.post("/echo/html/", { 
      html: trueFalse 
     }) 
    // `deferred.always` utilized here , 
    // to catch either `success` or `fail` , 
    // not certain about `error` (`fail`) callbacks ? 
     .always(function (data) { 
      dfd.resolve(data) 
     }) 
    }, 1000); 
    // return `deferred.promise()` , 
    // e.g., "true" , or "false" 
    return dfd.promise() 
}) 
}; 

UPDATE


很抱歉,如果這是以前沒有清除。這是遠程調用的XSP代碼。 pathInfo屬性是答案的一部分,但我還沒有想出如何使用它來通過URL來引用方法,這正是我所尋求的。如果我參考「.../rpc」,則會得到一個正在進行的「服務錯誤」消息。 如何通過URL調用方法裏面的RPC-JSON是我的問題?

<xe:jsonRpcService id="jsonRpcService2" serviceName="openATMRPC" pathInfo="rpc"> 
     <xe:this.methods>        
      <xe:remoteMethod name="openATMFirst"> 
<xe:this.script> 
<![CDATA[print("into First"); 
var firstTry:boolean = atmBean.openATM(atmBean.atmID, userBean.userID, userBean.userPassword); 
if(firstTry == false){ 
    return firstTry.toString(); 
} else if(firstTry == true){ 
    //atmBean.infoMessage = atmBean.atmID + " has been successfully Opened."; 
    return firstTry.toString(); 
}]]></xe:this.script></xe:remoteMethod> 
+0

這不是一個XPages問題。這是一個jQuery的問題。沒有服務器端,沒有xpages解決方案 – stwissel 2014-09-30 15:08:44

+0

我只標記XPage,因爲問題是使用URL調用Ext Lib組件JSON-RPC。我認爲這對於非XPage開發者來說意義不大。 – 2014-09-30 15:18:07

+0

它對XPages開發者也不意味着。你顯示一小部分沒有上下文的客戶端JS。使用靜態響應模擬服務器端以使客戶端工作。分開這兩個部分 – stwissel 2014-09-30 15:22:19

回答

1

您正在尋找的最可能的部分是JSON REST控件的確切地址。他們生活在XPage內(頁面不需要做任何有用的事情)。看一個示例服務:

<?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"> 
     <xe:jsonRpcService id="jsonRpcService1" serviceName="helloService"> 
     <xe:this.methods> 
      <xe:remoteMethod name="sayHello"> 

       <xe:this.arguments> 
        <xe:remoteMethodArg name="who" type="string"></xe:remoteMethodArg> 
       </xe:this.arguments> 
       <xe:this.script><![CDATA[return "Hello " + who;]]></xe:this.script> 
      </xe:remoteMethod> 
     </xe:this.methods> 
    </xe:jsonRpcService> 
     <xp:label value="Who" id="label1" for="inputText1"></xp:label> 
     <xp:inputText id="inputText1" value="#{viewScope.who}"></xp:inputText> 
     <xp:button value="Greet Me" id="button1"> 
      <xp:eventHandler event="onclick" submit="false"> 
       <xp:this.script><![CDATA[var deferred = helloService.sayHello(dojo.byId("#{id:inputText1}").value); 
deferred.addCallback(function(result) { 
    alert(result) 
});]]></xp:this.script> 
      </xp:eventHandler></xp:button> 
</xp:view> 

當然,這是在引擎蓋下使用Dojo。但是,當你看服務URL - 你可能在找什麼,你覺得是這樣的:

/yournsf.nsf/sample.xsp?$$viewid=!dwjn9ryrqh!&$$axtarget=view:_id1:jsonRpcService1

的第一個值在一個隱藏字段發下來瀏覽器的名稱(而不是ID )$$ viewid,第二個是#{id:jsonRpcService1}

所以你可以使用scriptblock發送這個值並得到你的終點。 REST服務很可能在那裏更容易,但這取決於您。

+0

是的,這是我一直在尋找的。對不起,我沒有說清楚我在問什麼。謝謝! – 2014-09-30 16:55:35

+0

我們終於明白了。所以沒有問題。這就是老師的意思;-) – stwissel 2014-09-30 16:56:19

+0

面向東方的禮儀弓正朝着你的方向前進:) Sensei :) – 2014-09-30 17:11:51