尝试使用Strophe发送XMPP IQ节

时间:2017-04-21 21:21:32

标签: javascript xml xmpp 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,但我相信必须有一个解决方案而不使用它。

1 个答案:

答案 0 :(得分:1)

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

您可以使用实用程序函数Strophe.$msg(用于“message”节),Strophe.$pres(用于“presence”节)和{{3}来执行此操作,而不是直接调用Strophe.Builder。 (对于“IQ”节)。

通过Strophe.$iq方法添加子元素,并通过c方法添加文本。

例如:

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

这些函数和方法返回生成的Strophe.Builder对象。因此,如果您使用c添加子项,则会返回该子项。如果要将另一个子项添加到父项,则使用t将上下文移回父项。

例如:

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

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

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

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