Вызов метода JSON-RPC через URL-адрес с использованием jQuery

Мне нужно сослаться на метод JSON-RPC по URL-адресу и задаться вопросом, как это сделать или можете ли вы это сделать.

Я хочу сделать это таким образом, потому что я хочу сделать вызов внутри $.post, используя jQuery.deferred(). Посмотрите на этот пример, чтобы увидеть, чего я пытаюсь достичь. Я хочу заменить "/echo/html/" своим методом RPC. Если бы мне пришлось, я мог бы переписать свой 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», я получаю сообщение «Ошибка службы», которое является прогрессом. Как мне вызвать метод внутри RPC-JSON через URL-адрес?

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

person Steve Zavocki    schedule 30.09.2014    source источник
comment
Это не вопрос XPages. Это вопрос jquery. Без серверной части нет решения xpages   -  person stwissel    schedule 30.09.2014
comment
Я пометил только XPages, потому что проблема заключалась в вызове компонента Ext Lib JSON-RPC с использованием URL-адреса. Я не думал, что это будет иметь большое значение для разработчиков, не использующих XPage.   -  person Steve Zavocki    schedule 30.09.2014
comment
Это также не означает для разработчика XPages. Вы показываете часть JS на стороне клиента без контекста. Смоделируйте серверную часть со статическим ответом, чтобы клиентская сторона заработала. Разделите две части   -  person stwissel    schedule 30.09.2014
comment
Достаточно справедливо, я обновлю вопрос с кодом JSON-RPC XSP. Поскольку я задал вопрос, я обнаружил свойство pathInfo, теперь мне просто нужно знать, как вызвать метод.   -  person Steve Zavocki    schedule 30.09.2014
comment
PathInfo - это не то, что я думал. Я не думаю, что то, что я пытаюсь сделать, возможно, поэтому я не думаю, что на этот вопрос можно ответить. Я пришел к выводу, что элемент управления JSON-RPC не предназначен для вызова из URL-адреса. Я закрою вопрос позже.   -  person Steve Zavocki    schedule 30.09.2014
comment
Стефан, я не уверен, что вы имеете в виду под своим последним комментарием. Мне кажется, что я в тупике, если я что-то упускаю, дайте мне знать.   -  person Steve Zavocki    schedule 30.09.2014
comment
Давайте продолжим обсуждение в чате.   -  person stwissel    schedule 30.09.2014


Ответы (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 будет проще, но это на ваше усмотрение.

person stwissel    schedule 30.09.2014
comment
Да, это то, что я искал. Извините, я не ясно дал понять, о чем я спрашивал. Спасибо! - person Steve Zavocki; 30.09.2014
comment
Мы разобрались наконец. Так что без проблем. Для этого и существует сэнсэй ;-) - person stwissel; 30.09.2014
comment
Церемониальный поклон лицом на восток, направляясь к вам, сэнсэй :) - person Steve Zavocki; 30.09.2014