发送自定义IQ时服务器的服务不可用响应

时间:2014-10-24 13:10:57

标签: android xmpp openfire smack asmack

我正在尝试使用来自android的asmack中的IQ发送自定义信息。

所以我使用下面的代码发送自定义IQ消息。

public void onClick(View arg0) {

            CustomIQ req = new CustomIQ();
            req.myData="Hello world";
            req.setType(IQ.Type.GET);
            req.setTo(Activity_title+Constants.DOMAIN);
            MainActivity.connection.sendPacket(req);
            Log.d(Constants.TAG, "xml value :"+req.toXML());
        Log.d(Constants.TAG, "child element value :"+req.getChildElementXML());
            Log.d(Constants.TAG, " custom IQ req sent");

以下是我的自定义IQ类实现:

import org.jivesoftware.smack.packet.IQ;

public class CustomIQ extends IQ {

    String myData;

    @Override
    public String getChildElementXML() {

        String request = "<query xmlns='myxmlns'>"
                        + "<myData>"+ myData + "</myData>"
                        + "</query>";

        return request;
    }

}


            }

但是在发送自定义IQ之后,我将IQ监听器作为服务不可用而错误代码为503。

以下是对服务器的请求:

xml value :<iq id="BTn30-5" to="swathi@btp121374" type="get"><query xmlns='myxmlns'><myData>Hello world</myData></query></iq>
child element value :<query xmlns='myxmlns'><myData>Hello world</myData></query>

以下是服务器的响应:

xml value :<iq id="BTn30-5" to="ganesh@btp121374/Smack" from="swathi@btp121374" type="error"><query xmlns='myxmlns'><myData>Hello world</myData></query><error code="503" type="CANCEL"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

那么我从服务器获得服务不可用的原因是什么原因。

编辑:

我实现了IQProvider,如下所示

public class customIQProvider implements IQProvider{

    @Override
    public IQ parseIQ(XmlPullParser parser) throws Exception {

        Log.d(Constants.TAG, "In custom IQ provider");
        CustomIQ myIQ_ref = new CustomIQ();


        int eventType = parser.next();

        while(eventType == XmlPullParser.START_TAG){

            switch(parser.getEventType()){
            case XmlPullParser.START_TAG:
            {
                if(parser.getName().equals("myData")){
                     myIQ_ref.myData=(parser.nextText());
                }
            }
            return myIQ_ref;
            }
        }

    return null;
    }

}

2 个答案:

答案 0 :(得分:2)

我相信你在XMPP中违反了iq路由规则。如果您将iq节发送到&#34; swathi @ btp121374&#34;,您并不是要求将其路由到客户端,那么您要求btp121374服务器代表swathi @处理它btp121374。

鉴于发送JID的资源,我想你想发送给&#34; swathi @ btp121374 / Smack&#34;或类似的。将它发送到完整的JID(包括资源的JID)告诉服务器将其路由到客户端而不是自己处理它。

(请注意,presence,message和iq的路由规则不同 - 以上仅适用于iq)

答案 1 :(得分:0)

显然,服务器不知道如何处理新的命名空间,除非您也在服务器上实现它。您希望服务器对您的自定义元素做什么?

此外,通过连接字符串生成XML通常是个坏主意。如果myData包含<或任何其他需要转义的字符,则您的XML将无效。 Smack肯定有更好的方法来生成自定义数据。