我尝试设置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;选项我在将项目发布到节点时没有错误...
答案 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>