尝试使用 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);
我正在尝试发送 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);