XMPP IQ 结果解析问题

Posted

技术标签:

【中文标题】XMPP IQ 结果解析问题【英文标题】:XMPP IQ result parsing issue 【发布时间】:2012-11-08 14:00:56 【问题描述】:

我正在使用 eclipse、java 和 asmack 构建一个 XMPP 聊天客户端应用程序。使用教程和许多谷歌搜索,我设法让好友列表正常工作,实际聊天也很好。 我的问题是寻找更多好友以添加到我的联系人列表中。要发送的 XML 示例如下:http://xmpp.org/extensions/xep-0055.html 我的要求是:

<iq
id="search123"
from="name3@webserv.xxx.com/name3"
to="search.xxx.zzz.com"
type="set" >
<query xmlns="jabber:iq:search" >
    <nick>
android
    </nick>
</query>
</iq>

我以为我得到的回应是/是这样的:

<iq
id="search123"
from="search.xxx.zzz.com"
to="name3@webserv.telebroad.com/Smack"
type="result" >
</iq>

但是使用 connConfig.setDebuggerEnabled(true); (和一个在线 Telnet 客户端)我设法发现服务器实际上工作正常并且它正在发送请求的结果,但我只是得到你在上面看到的内容。 我已经在这里待了 4 天,我的自尊心很低:P 这是我关于 IQ 请求和响应的代码:

Packet asdf = new Packet() 
                    @Override
                    public String toXML() 
                        return    "<iq type='set'"+
                                " from='name3@webserv.xxx.com/name3'"+
                                " to='search.xxx.zzz.com'"+
                                " id='search2'"+
                                " xml:lang='en'>"+
                              " <query xmlns='jabber:iq:search'>"+
                                " <nick>Android</nick>"+
                              " </query>"+
                            " </iq>";
                    
                ;


ChatList.connection.sendPacket(asdf);
                Log.e("packet", "request = "+ asdf.toXML());
                PacketFilter filter = new IQTypeFilter(IQ.Type.RESULT);
                ChatList.connection.addPacketListener(new PacketListener() 
                    public void processPacket(Packet packet) 
                        IQ iq = (IQ)packet;


                        Log.e("response","incoming packet : "+ packet.toXML());
                        Log.e("response","incoming packet2 : "+ packet.toString());

                    
                , filter);  

我尝试了很多类型过滤器都无济于事。我被难住了!!

底线:

1.请求被服务器正确接受;

2.服务器响应正确(调试器这么说);

3.any response.toString 或 toXML 从上面打印出类型结果 XML(没有 type='result' 之后的实际项>。

4.我的这个应用程序的最终版本大约逾期一周...帮助! :)

【问题讨论】:

您使用的是哪个 asmack 版本/化身? 【参考方案1】:

尝试添加

ProviderManager pm = ProviderManager.getInstance(); 
pm.addIQProvider( "query","jabber:iq:search",new UserSearch.Provider());
pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());

在建立连接之前。

【讨论】:

感谢您的回复。我会尽快尝试。希望它有效。【参考方案2】:

此规范已通过 UserSearchManager 实现。尝试使用它。

至于你自己的情况,我猜你没有为这个特定的元素和命名空间(比如 org.jivesoftware.smackx.search.UserSearch$Provider)注册一个合适的provider。在普通的 Java 环境中,这已经被注册了,但是您必须在 Android 中自己编写代码。

【讨论】:

谢谢罗宾。我的 javadoc 无法正常工作(我是菜鸟),所以您确实为我指明了正确的方向。我设法检索到我想要的数据。它在 ReportedData data = usm.getSearchResults ...现在我只需要将它从这个“数据”变量中取出:P。完成后,我将编辑我的问题以包含结果的完整代码。希望能拯救别人我不得不经历的痛苦:P 我仍然无法从 ReportedData 变量中获取数据。 link 这是我能找到的最接近实际解决方案的东西,但仍然不够。有什么想法吗?【参考方案3】:

https://***.com/a/14214622/1688731 这......只是工作!!!!我不知道为什么。也许Iterator iterator = row.getValues("jid"); 可以解决问题。但是其他的,我已经尝试了很多次了!!

【讨论】:

以上是关于XMPP IQ 结果解析问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JAXL PHP 库 IQ Query Action Protocol XMPP

Python-XMPP - 迭代 IQ 节项目

使用 XMPP 的谷歌谈话服务器没有会话 IQ 响应

发送和接收 IQ ASMACK Android XMPP

在 Android 上使用 aSmack 发送和接收自定义 XMPP IQ

XMPP:Ejabberd 未将具有命名空间前缀的自定义 IQ 转发给用户