通过 XMPP 进行 XML RPC

Posted

技术标签:

【中文标题】通过 XMPP 进行 XML RPC【英文标题】:XML RPC via XMPP 【发布时间】:2012-05-31 22:23:24 【问题描述】:

我目前正在尝试通过 XMPP 实现 XML RPC。我使用 Smack 作为客户端库,使用 Vysper 作为 XMPP 服务器。简化后,我的设置如下所示:

[client1] — [server] — [client2]

我想从客户端 1 调用客户端 2 上的方法。我创建了一个类型为 set 的 IQ,以及 from 和 to 元素以及 [1] 中所述的查询内容。简化示例:

<iq type='set' from='client1@localhost' to='client2@localhost' id='1'>
  <query xmlns='jabber:iq:rpc'>
    <methodCall>
      <methodName>foo</methodName>
    </methodCall>
  </query>
</iq>

问题是,当从 client1 发送 IQ 时,我收到一个错误 IQ,并且没有任何内容提交给 client2。调查问题时,我在规范 [2] 中看到了这个声明:

服务器必须忽略名册“集”上的任何“收件人”地址,并且必须将任何名册“集”视为适用于发送者。 […]

我说得对吗,在这个星座中,两个客户端之间不可能有 Jabber-RPC?还是我对 Jabber-RPC 有根本的误解?

[1]http://xmpp.org/extensions/xep-0009.html

[2]http://xmpp.org/rfcs/rfc3921.html#roster

【问题讨论】:

【参考方案1】:

看起来您将 Iq 节发送到客户端的裸 JID 而不是完整的 JID,即 client2@example.com 而不是 client2@example.com/resource

发送到裸 JID 的 Iq 节由服务器处理,不会路由到客户端。您实质上是在查询用户的帐户,而不是与特定的连接代理进行交互。通常,您总是希望指定收件人的完整 JID。

【讨论】:

谢谢@Lance,这有助于解决我的问题。我还有一些必须解决的 Vysper 特定问题(Vysper 目前代表它自己分配资源名称,而不是使用建议的客户端 (issues.apache.org/jira/browse/VYSPER-297),因此这涉及一些进一步的解决方法),但现在基本工作正常: ) 关于资源选择的提示:不要依赖它,因为它总是由服务器决定。您可能应该使用 Presence 来研究发现。

以上是关于通过 XMPP 进行 XML RPC的主要内容,如果未能解决你的问题,请参考以下文章

xmpp即时通讯协议的特性---长处和缺点!

通过XML-RPC发送远程信号

XML-RPC 的非交互式身份验证/授权?

通过 XMPP 进行 SOAP/REST 调用

Odoo(OpenERP)开发实践:通过XML-RPC接口访问Odoo数据库

XMPP:允许客户端通过代理进行通信?