【问题标题】:service unavailable response from server while sending custom IQ发送自定义 IQ 时来自服务器的服务不可用响应
【发布时间】:2014-12-20 07:54:44
【问题描述】:

我正在尝试从 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;
    }

}

【问题讨论】:

  • IQ 的(预期)接收者是谁?

标签: android xmpp openfire smack asmack


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我正在尝试从接收者那里获取一些信息。因此,在收件人端收到它后,我将再次发回带有所需信息的 IQ。除了聊天消息,还有什么更好的信息交流方式。
  • 如果你想把它发送给其他人,你应该给 iq 添加一个“to”属性。现在,您正在处理您的服务器。
  • 我在将数据包发送为 req.setTo(Activity_title+Constants.DOMAIN) 时设置了 to 值。所以这个值在运行时反映为 IQ xml 中的“swathi@btp121374”。您是在说这些设置之外的内容吗?请帮忙。
【解决方案2】:

我相信您违反了 XMPP 中的 iq 路由规则。如果您将 iq 节发送到“swathi@btp121374”,您并不是要求将其路由到客户端,而是要求 btp121374 服务器代表 swathi@btp121374 处理它。

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

(注意presence、message和iq的路由规则是不同的——以上只适用于iq)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2011-01-26
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多