发送自定义 IQ 查询 (Android)(Smack)

Posted

技术标签:

【中文标题】发送自定义 IQ 查询 (Android)(Smack)【英文标题】:Sending a custom IQ query (Android)(Smack) 【发布时间】:2016-12-25 18:01:02 【问题描述】:

结果的格式是这样的。

<iq from='52@localhost' to='20@localhost/Gajim' id='253' type='result'>
<query xmlns='someName'>
<item subscription='both' jid='1@localhost'/>
</query>
</iq>

我正在尝试使用以下格式发送自定义 iq 查询。

 <iq xmlns="Name" type="get" id="253">
    <query xmlns="someName">
    <auth type='token'>asd</auth>
    </query>
    </iq>

据我了解,我需要发送带有授权类型令牌(令牌 id)的查询。这是我的尝试。

final IQ iq = new IQ()   
  @Override  
  public String getChildElementXML()   
    return "<query xmlns='someName'auth type="+t_id"+"asd<................'</query>"; // I am confused on how to write here  
    
;  
iq.setType(IQ.Type.get);  
connection.sendPacket(iq); // connection is an XMPPTCPConnection object.

我对如何完成这个 getChildElementXML() 感到困惑,而且当我尝试实例化一个新的 IQ 时出现错误,因为我需要实现一些构建器方法。我应该创建一个用于发送自定义 IQ 查询的新类吗?有人可以展示如何做吗?

注意:非常感谢建设性的反馈,如果有人指出歧义,我可以让问题更清楚。

【问题讨论】:

【参考方案1】:

这将回答您的问题,但请记住,在下一步中您将需要这样的东西:Mapping Openfire Custom plugin with aSmack Client


一般来说,ID 是由 smack API 创建的,你不应该手动分配它。

一般来说,xmnls 但要分配给自定义标签而不是 IQ 本身。

我们的目标:

 <iq from="me@domain" to="domain" type="get" id="253">
    <query xmlns="someName">
    <auth type='token'>asd</auth>
    </query>
    </iq>

你的班级会是什么样子:

package ....;

import org.jivesoftware.smack.packet.IQ;



public class IQCustomAuth extends IQ

public final static String childElementName = "query";
public final static String childElementNamespace = "com:prethia:query#auth";


private final String auth;
private final String typeAuth;

public IQCustomAuth(String userFrom, String server, String typeAuth, String auth)


    super( childElementName, childElementNamespace );
    this.setType( IQ.Type.get );
    this.auth = auth;
    this.typeAuth = typeAuth;
    setTo( server );
    setFrom( userFrom );




@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder( IQChildElementXmlStringBuilder xml )


    xml.rightAngleBracket();
    xml.halfOpenElement( "auth ");
    xml.attribute( "type", this.typeAuth );
    xml.rightAngleBracket();
    xml.append(auth);
    xml.closeElement("auth");
    return xml;






测试:

IQCustomAuth iq = new IQCustomAuth( "me@domain", "domain", "token", "asd" );
System.out.println(iq.toString());

发送:

connection.sendPacket(new IQCustomAuth( "me@domain", "domain", "token", "asd" ));

【讨论】:

我会告诉你的,我现在就试试。顺便说一句,您未能格式化代码 顺便说一句,我在标题中没有 to 字段。是我用于 XMPP 连接的服务器吗? connection.getServiceName() (connection 是 AbstractXMPPConnection 的对象)。理论上你可以避免设置“to”,但在某些情况下可能会丢失数据包 您好,您的答案有效,我赞成,我会接受它作为答案,但我无法以您在其他答案中给出的格式得到答案。您可以根据该响应调整此答案吗?我正在提供结果的格式 我理解您的麻烦,但实现了一个完整的自定义 iq,这是不可能的,而且话题太大,无法发表评论。看看我的答案中的第一个链接。但是,您似乎正在尝试实现像 xmpp.org/extensions/xep-0078.html 这样的旧事物,也许有一些 api 准备好管理它。请求类型

以上是关于发送自定义 IQ 查询 (Android)(Smack)的主要内容,如果未能解决你的问题,请参考以下文章

使用 openfire 服务器自定义 iq

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

发送和接收 IQ ASMACK Android XMPP

如何使用 Smack Android 库将 XMPP IQ 节发送到服务器?

ejabberd - 自定义 iq 处理程序

asmak 数据包侦听器和自定义 IQProvider 未触发/调用