我试图发送一个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,但我相信必须有一个解决方案而不使用它。
答案 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);