XMPP按最新消息查询归档

nhe*_*que 6 xmpp ejabberd

我正在阅读http://xmpp.org/extensions/xep-0313.html以查询Ejabberd以查找使用特定用户存档的邮件.

这是我发送的xml:

<iq type='get' id='get_archive_user1'>
 <query xmlns='urn:xmpp:mam:tmp'>
  <with>user1@localhost</with>
  <set xmlns='http://jabber.org/protocol/rsm'>
   <max>20</max>
  </set>
 </query>
</iq>
Run Code Online (Sandbox Code Playgroud)

我正确收到了前20封邮件.要再次请求我添加标签:

<after>(id in element "Last" from last request)</after>
Run Code Online (Sandbox Code Playgroud)

这也很好.我需要的是接收最后20条消息,而不是前20条消息.我怎样才能做到这一点?

Mic*_*ond 10

XEP-0313消息归档管理依靠XEP-0059结果集管理进行分页.

RSM规范说明了如何获取结果集中的最后一页:

请求实体可以通过在其请求中包括空<before/>元素以及要返回的最大项目数来请求结果集中的最后一页.

这意味着您需要<before/>在结果集查询中添加一个空元素.

这是一个基于XEP-0313版本0.4的示例,介绍如何在与给定用户的对话中获取最后20条消息.查询限制由参数max定义(它定义了页面的大小).

<iq type='set' id='q29302'>
  <query xmlns='urn:xmpp:mam:0'>
    <x xmlns='jabber:x:data' type='submit'>
      <field var='FORM_TYPE' type='hidden'>
        <value>urn:xmpp:mam:0</value>
      </field>
      <field var='with'>
        <value>juliet@capulet.lit</value>
      </field>
    </x>
    <set xmlns='http://jabber.org/protocol/rsm'>
     <max>20</max>
     <before/>
    </set>
  </query>
</iq>
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你.这完全符合我的预期.要加载接下来的20条消息,我正在添加<before>(最后一次请求的第一条消息ID)</ before>,它也正常工作! (2认同)

xny*_*hps 6

你应该添加一个空<before/>元素:

<iq type='get' id='get_archive_user1'>
    <query xmlns='urn:xmpp:mam:tmp'>
        <with>user1@localhost</with>
        <set xmlns='http://jabber.org/protocol/rsm'>
            <max>20</max>
            <before/>
        </set>
    </query>
</iq>
Run Code Online (Sandbox Code Playgroud)

看到这里.