【问题标题】:Trying to send XMPP IQ stanza with Strophe尝试使用 Strophe 发送 XMPP IQ 节
【发布时间】:2017-09-19 00:24:44
【问题描述】:

我正在尝试使用 strophe 库发送一个 IQ 节来请求用户名册。 Strophe为此提供了一个函数,称为sendIQ

我尝试像这样发送 IQ 节:

let iq_str = "<iq type='get' id='roster1'><query xmlns='jabber:iq:roster'/></iq>";
let parser = new DOMParser();
let iq = parser.parseFromString(iq_str, "text/xml");
XMPP.conn.sendIQ(iq, onRoster);

但是,strophe 的 sendIQ 函数在 var id = elem.getAttribute('id'); 行中崩溃并出现 TypeError: e.getAttribute is not a function 错误,因为(如果我理解正确的话)iq 不是 XML 元素对象,而是 XML 文档对象。

经过一番搜索,我可以通过这样做来避免崩溃:

let iq_str = "<iq type='get' id='roster1'><query xmlns='jabber:iq:roster'/></iq>";
let parser = new DOMParser();
let iq = parser.parseFromString(iq_str, "text/xml").getElementsByTagName("iq")[0];
XMPP.conn.sendIQ(iq, onRoster);

但是这样我显然没有收到任何回复,因为我没有在传递的iq 变量中指定查询。

我觉得我一定错过了一些非常微不足道的东西,但我已经被困了一段时间了。我发现的所有示例都使用 jQuery,但我相信必须有一个不使用它的解决方案。

【问题讨论】:

  • 我的错,getElementsByTagName 确实返回了子元素,所以 IQ 是正确的。问题是我没有注意到回调 onRoster 中的错误。

标签: javascript xml xmpp strophe


【解决方案1】:

您应该使用 Strophe 自己的 Strophe.Builder 构造函数来创建 XML 节而不是浏览器的 DOMParser API。

您可以使用实用函数Strophe.$msg(用于“消息”节)、Strophe.$pres(用于“存在”节)和Strophe.$iq(用于“IQ”)来代替直接调用 Strophe.Builder,而不是直接调用 Strophe.Builder节)。

子元素通过c 方法添加,文本通过t 方法添加。

例如:

$msg({'to': 'someond@example.org'}).c('body').t('Hello world!);

这些函数和方法返回生成的 Strophe.Builder 对象。因此,如果您使用c 添加了一个孩子,它将返回那个孩子。如果要向父级添加另一个子级,请使用 up 将上下文移回父级。

例如:

$msg({'to': 'someond@example.org'}).c('child1').up().c('child2');

还有一个更通用、更低级别的 $build 函数,由 $msg、$pres 和 $iq 调用,您可以使用它来生成其他 XML 节,但很少需要它。

因此,要创建和发送您的特定 IQ 节,您需要执行以下操作:

let iq = $iq({'type':'get', 'id':'roster1'}).c('query', {'xmlns':'jabber:iq:roster'});
XMPP.conn.sendIQ(iq, onRoster);

【讨论】:

  • 感谢您的回答和解释。我实际上已经尝试过(这是我找到的第一个示例),但不断收到 $iq is not defined 错误。我最终认为它失败的原因是因为它实际上是 jQuery,但现在我发现我错了。我一直收到同样的错误。
  • 没关系,我在 strophe 导入中添加了 $iq 并且它起作用了。
猜你喜欢
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多