设置XMPP发布 - 订阅节点:项目禁止错误将项目发布到节点

时间:2014-04-02 15:46:24

标签: xmpp publish-subscribe

我尝试设置XMPP发布 - 订阅节点并对其进行配置,以便在将新项目发布到节点时,有效负载会自动传递给所有订阅者。 为此,我设置了" pubsub#deliver_payloads"配置选项为true,但是当将项目发布到节点时,我收到错误。以下是我正在做的事情的细节:

首先我创建节点:

<body rid='614709033' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq to='pubsub.myserver' type='set' xmlns='jabber:client' id='2:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <create node='mynode'/>
        </pubsub>
    </iq>
</body>

服务器回复说它没关系:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="result" id="2:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0"/>
</body>

然后我配置节点设置&#34; pubsub#deliver_payloads&#34;以这种方式选择&#34; true&#34;:

<body rid='614709036' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='4:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
            <configure node='mynode'>
                <x xmlns='jabber:x:data' type='submit'>
                    <field var='pubsub#deliver_payloads'>
                        <value>true</value>
                    </field>
                </x>
            </configure>
        </pubsub>
    </iq>
</body>

服务器成功回复:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="result" id="4:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0"/>
</body>

但是当我尝试将一些数据发布到该节点上时,如下所示:

<body rid='614709038' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq type='set' to='pubsub.myserver' xmlns='jabber:client' id='5:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <publish node='mynode'>
                <item id='test'>
                    <geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>
                    <lat>0.55</lat>
                    <lon>1.66</lon>
                    <timestamp>2014-04-02T15:14:58.783Z</timestamp>
                    </geoloc>
                </item>
            </publish>
        </pubsub>
    </iq>
</body>

服务器回复此错误:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="error" id="5:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0">
        <pubsub xmlns="http://jabber.org/protocol/pubsub">
            <publish node="mynode">
                <item id="test">
                    <geoloc xmlns="http://jabber.org/protocol/geoloc" xml:lang="en">
                        <lat>0.55</lat>
                        <lon>1.66</lon>
                        <timestamp>2014-04-02T15:14:58.783Z</timestamp>
                    </geoloc>
                </item>
            </publish>
        </pubsub>
        <error code="400" type="modify">
            <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
            <item-forbidden xmlns="http://jabber.org/protocol/pubsub#errors"/>
        </error>
    </iq>
</body>

我使用Openfire 3.9.1作为服务器,而在客户端我使用javascript和Strophe库。

有谁能解释我为什么会收到此错误?

我尝试在节点上使用不同的配置,当我省略&#34; pubsub#deliver_payloads&#34;选项我在将项目发布到节点时没有错误...

2 个答案:

答案 0 :(得分:1)

XEP-0060: Publish-Subscribe中解释了所有错误情况。您可以在7.1.3.6 Request Does Not Match Configuration找到item-forbidden错误消息,其中显示为:

  

如果事件类型是notification + transient和发布者   提供一个项目,服务必须弹出发布请求   错误和特定于pubsub的错误条件   

答案 1 :(得分:0)

好的,我知道,在配置中只有“pubsub#deliver_payloads”选项,节点被视为“瞬态节点”(不允许任何项目)。

但是,如果我更改配置以使节点“持久”(即添加“pubsub#persist_items”并将其设置为true),则服务器不应该抱怨,根据XEP-0060的4.3事件类型,表4.

但是有了这个配置:

<iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='5:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
        <configure node='mynode'>
            <x xmlns='jabber:x:data' type='submit'>
                <field var='pubsub#persist_items'>
                    <value>true</value>
                </field>
                <field var='pubsub#deliver_payloads'>
                    <value>true</value>
                </field>
            </x>
        </configure>
    </pubsub>
</iq>

如果我尝试将一个项目发布到节点,我仍会得到同样的错误:

<iq xmlns="jabber:client" type="error" id="13:sendIQ" from="pubsub.myserver" to="user@myserver/2b35c426">
    <pubsub xmlns="http://jabber.org/protocol/pubsub">
        <publish node="mynode">
            <item id="test">
                <geoloc xmlns="http://jabber.org/protocol/geoloc" xml:lang="en">
                    <lat>0.55</lat>
                    <lon>1.66</lon>
                    <timestamp>2014-04-03T08:50:48.682Z</timestamp>
                </geoloc>
            </item>
        </publish>
    </pubsub>
    <error code="400" type="modify">
        <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
        <item-forbidden xmlns="http://jabber.org/protocol/pubsub#errors"/>
    </error>
</iq>

我通过简单地将配置中的值从“true”变为“1”来解决问题。实际上,在读取XEP-0060规范时,配置示例中使用“true” - “false”和“1” - “0”值。但是,当我要求配置节点时,Openfire服务器发送给我的形式,只使用“1” - “0”值。

使用以下配置,一切正常:

<iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='5:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
        <configure node='mynode'>
            <x xmlns='jabber:x:data' type='submit'>
                <field var='pubsub#persist_items'>
                    <value>1</value>
                </field>
                <field var='pubsub#deliver_payloads'>
                    <value>1</value>
                </field>
            </x>
        </configure>
    </pubsub>
</iq>