发送自定义 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)的主要内容,如果未能解决你的问题,请参考以下文章
XMPP:Ejabberd 未将具有命名空间前缀的自定义 IQ 转发给用户