我需要通过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()
})
};
更新
很抱歉,如果以前不清楚这一点。这是远程调用的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 :(得分: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}
因此,您可以使用脚本块将该值发送下来并获得终点。很可能REST服务在那里会更容易,但这取决于你。