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

时间:2016-12-25 18:01:02

标签: android xmpp smack

结果格式为此。

<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 个答案:

答案 0 :(得分:1)

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

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

一般来说,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" ));