【问题标题】:Call JSON-RPC method via URL using jQuery使用 jQuery 通过 URL 调用 JSON-RPC 方法
【发布时间】:2014-09-30 14:01:33
【问题描述】:

我需要通过 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>

【问题讨论】:

  • 这不是 XPages 问题。这是一个jQuery问题。没有服务器端就没有 xpages 解决方案
  • 我只标记了 XPages,因为问题是使用 URL 调用 Ext Lib 组件 JSON-RPC。我认为这对非 XPage 开发人员来说意义不大。
  • 这对 XPages 开发人员也没有任何意义。您在没有上下文的情况下显示了客户端 JS 的一小部分。使用静态响应模拟服务器端以使客户端正常工作。分开两块
  • 很公平,我将使用 JSON-RPC XSP 代码更新问题。自从我问了这个问题,我发现了 pathInfo 属性,现在我只需要知道如何调用该方法。
  • pathInfo 不是我想的那样。我不认为我想做的事情是可能的,因此我认为这个问题无法回答。我的结论是 JSON-RPC 控件不打算从 URL 调用。我稍后会结束问题。

标签: jquery json xpages json-rpc


【解决方案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=<b>!dwjn9ryrqh!</b>&amp;$$axtarget=<b>view:_id1:jsonRpcService1</b>

第一个值由浏览器在隐藏字段中发送,名称(不是id)$$viewid,第二个是#{id:jsonRpcService1}

因此,您可以使用脚本块将该值向下发送并获取您的端点。 REST 服务很可能在那里会更容易,但这取决于您。

【讨论】:

  • 是的,这就是我要找的。抱歉,我没有说清楚我在问什么。谢谢!
  • 我们终于想通了。所以没问题。这就是 Sensei 的用途 ;-)
  • 礼仪鞠躬面向东方,向老师前进 :)
猜你喜欢
  • 2023-03-31
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多