尝试使用 Strophe 发送 XMPP IQ 节

Trying to send XMPP IQ stanza with Strophe

我正在尝试发送 IQ 节以使用 strophe 库请求用户名册。 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,但我相信必须有一个不使用它的解决方案。

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

您可以使用实用函数 Strophe.$msg (for "message" stanzas), Strophe.$pres (for "presence" stanzas) and Strophe.$iq(对于 "IQ" 节)而不是直接调用 Strophe.Builder。

Child 元素通过 c method and text via the t 方法添加。

例如:

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

这些函数和方法return生成Strophe.Builderobject。因此,如果您使用 c 添加一个 child,它将 return 即 child。如果要将另一个 child 添加到 parent,请使用 up 将上下文移回 parent。

例如:

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

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

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

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