Анализ ответов веб-сокета XML с помощью Strophe.js

Я использую Strophe.js для подключения к серверу XMPP через веб-сокеты. Вот пример ответа, который я получаю, когда подключенный пользователь получает сообщение:

<message xmlns='jabber:client' xml:lang='en' to='[email protected]/6665193359253278721998' from='[email protected]/Mac' type='chat' id='purple42fccc5c'> 
  <archived by='[email protected]' id='1557026681122740' xmlns='urn:xmpp:mam:tmp'/>
  <stanza-id by='[email protected]' id='1557026681122740' xmlns='urn:xmpp:sid:0'/>
  <active xmlns='http://jabber.org/protocol/chatstates'/> 
  <body>
    1
  </body>
</message>

Проверил документы, но не смог найти ничего полезного по этому вопросу. Есть ли в Strophe встроенный способ извлечения нужных мне данных из различных типов сообщений? Или мне нужно что-то еще?


person Norbert    schedule 07.05.2019    source источник
comment
Понятия не имею о встроенных модулях, но вы можете разобрать строку xml в документ xml, используя DOMParser. Затем вы можете использовать обычные .getElementById() и т. д. или xpath для взаимодействия с XML. Если возможно, предпочтите JSON вместо XML в качестве формата сообщения, поскольку он меньше по размеру и с ним проще взаимодействовать.   -  person Shilly    schedule 07.05.2019


Ответы (1)


После создания соединения вам необходимо определить хуки для получения сообщения и возможности взаимодействия с ним:

connection.addHandler(onMessage, null, 'message', 'chat');
connection.addHandler(onMessage, null, 'message', 'groupchat');

И тогда вам просто нужно определить функцию onMessage.

onMessge: function(stanza) {
  $stanza = $(stanza);

  messageId = $stanza.attr('id') || null;
  to = $stanza.attr('to');
  from = $stanza.attr('from').toLowerCase();
  barejid = Strophe.getBareJidFromJid(from);

  type = $stanza.attr('type');
  bodies = $stanza.find('body');
  body = bodies.length ? Strophe.xmlunescape(Strophe.getText(bodies[0])) : '';
....

}

Надеюсь, это помогло.

person Simon Paitrault    schedule 16.05.2019