【问题标题】:Setting up XMPP Publish-Subscribe nodes: item-forbidden error posting items to the node设置 XMPP Publish-Subscribe 节点:item-forbidden error 将项目发布到节点
【发布时间】:2014-04-02 15:46:24
【问题描述】:

我正在尝试设置 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>

然后我配置节点将“pubsub#deliver_payloads”选项设置为“true”,这样:

<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 库。

谁能解释我为什么会收到这个错误?

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

【问题讨论】:

    标签: xmpp publish-subscribe


    【解决方案1】:

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

    如果事件类型是通知+瞬态并且发布者 提供一个项目,服务必须反弹发布请求 的错误和特定于 pubsub 的错误条件 .

    【讨论】:

      【解决方案2】:

      好的,我明白了,在配置中只有“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>
      

      【讨论】:

      • 您似乎发现了一个 openfire 不遵守规范的案例,我建议您向 openfire 开发者论坛报告。
      • 实际上,让我困惑的是 XEP-0060:虽然所有这些属性都定义为“布尔”,但在示例中它们有时使用“true”/“false”,有时使用“1” /“0”。例如,在示例 139 中,为什么值 'pubsub#deliver_notifications', type='boolean' 设置为“true”,而 'pubsub#persist_items', type='boolean' 设置为“1”?而且在示例 145 中,它们将真/假与 1/0 混合在一起(尽管它们看起来都是“布尔值”......)
      • 嗯,它在 XEP-0060 中的定义非常明确:xmpp.org/extensions/xep-0060.html#nt-id183715
      • 你说得对,“实现必须支持两种风格的词法表示”,我将把这个问题报告给 Openfire 开发者论坛。谢谢
      猜你喜欢
      • 1970-01-01
      • 2015-02-24
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多