绑定的 XMPP 服务器实现是否不遵循标准?
Are XMPP server implementations of binding not following the standard?
我最近尝试基于 RFC 6120 (9.1.3 pg 132) 绑定:
<iq id='tn281v37' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>
我会得到 'not well formed' 的回复:
<stream:error xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'><not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error>
用了几天才发现需要xmlns='jabber:client' :
<iq id='tn281v37' type='set' xmlns='jabber:client'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>
看起来 RFC 6120 没有被取代,我在网上找到的每个绑定示例都没有。这是由于服务器的实施吗?当时我绑定到 chinwag.im
这似乎是对 XML 名称空间工作方式的误解。在您的一条评论中,您建议您使用 jabber:socket
的命名空间,但这不是 XMPP 规范中任何地方定义的命名空间,我无法在网上找到任何对它的引用。相反,您想使用 jabber:client
(如果这是 server-to-server 连接,则使用 jabber:server
)。 XML 个命名空间的快速概览如下:
所有XML元素都有一个“名称”,这个名称由两部分组成:本地名称和命名空间。命名空间是使用 xmlns
属性定义的,例如以下是 不同的 元素,它们没有相同的名称:
<iq xmlns="jabber:client"/>
<iq xmlns="jabber:server"/>
使用 xmlns 属性声明的命名空间由其子元素继承(除非该元素具有自己的 xmlns 属性),因此在以下内容中:
<session xmlns="jabber:client">
<iq/>
<foo xmlns="bar"/>
</session>
“session”元素和“iq”元素都有命名空间“jabber:client”,但“foo”有命名空间“bar”。
还有另一种声明命名空间的方法:使用前缀。前缀使用“xmlns:prefix”属性声明(其中“prefix”是前缀的名称)。前缀列表被子元素继承,不需要重新声明,前缀定义的命名空间只适用于以“prefix:”开头的元素。例如:
<stream:stream xmlns="jabber:client"
xmlns:stream="http://etherx.jabber.org/streams">
<iq/>
<stream:error></stream:error>
</stream:stream>
在上面,“stream”元素有命名空间“http://etherx.jabber.org/streams”,因为它有“stream:”前缀。另一方面,“iq”元素具有“jabber:client”命名空间,因为它是从父级“xmlns”属性继承的。最后,“error”元素也有“http://etherx.jabber.org/streams”命名空间,因为它也使用了“stream:”前缀。请注意,它不必重新声明流前缀,因为它还从其父元素继承了一个前缀列表,因此只需应用没有 re-defining 的前缀就可以了。
从您提供的详细程度无法判断,但您可能需要将 xmlns="jabber:client"
添加到您的根元素。如果您没有要将其添加到的根元素(即,当您使用发送大量单独 XML 文档而不是一个长流的 websocket 协议时),则必须单独将其应用到您发送的每一帧中的根元素。
我最近尝试基于 RFC 6120 (9.1.3 pg 132) 绑定:
<iq id='tn281v37' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>
我会得到 'not well formed' 的回复:
<stream:error xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'><not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error>
用了几天才发现需要xmlns='jabber:client' :
<iq id='tn281v37' type='set' xmlns='jabber:client'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>
看起来 RFC 6120 没有被取代,我在网上找到的每个绑定示例都没有。这是由于服务器的实施吗?当时我绑定到 chinwag.im
这似乎是对 XML 名称空间工作方式的误解。在您的一条评论中,您建议您使用 jabber:socket
的命名空间,但这不是 XMPP 规范中任何地方定义的命名空间,我无法在网上找到任何对它的引用。相反,您想使用 jabber:client
(如果这是 server-to-server 连接,则使用 jabber:server
)。 XML 个命名空间的快速概览如下:
所有XML元素都有一个“名称”,这个名称由两部分组成:本地名称和命名空间。命名空间是使用 xmlns
属性定义的,例如以下是 不同的 元素,它们没有相同的名称:
<iq xmlns="jabber:client"/>
<iq xmlns="jabber:server"/>
使用 xmlns 属性声明的命名空间由其子元素继承(除非该元素具有自己的 xmlns 属性),因此在以下内容中:
<session xmlns="jabber:client">
<iq/>
<foo xmlns="bar"/>
</session>
“session”元素和“iq”元素都有命名空间“jabber:client”,但“foo”有命名空间“bar”。
还有另一种声明命名空间的方法:使用前缀。前缀使用“xmlns:prefix”属性声明(其中“prefix”是前缀的名称)。前缀列表被子元素继承,不需要重新声明,前缀定义的命名空间只适用于以“prefix:”开头的元素。例如:
<stream:stream xmlns="jabber:client"
xmlns:stream="http://etherx.jabber.org/streams">
<iq/>
<stream:error></stream:error>
</stream:stream>
在上面,“stream”元素有命名空间“http://etherx.jabber.org/streams”,因为它有“stream:”前缀。另一方面,“iq”元素具有“jabber:client”命名空间,因为它是从父级“xmlns”属性继承的。最后,“error”元素也有“http://etherx.jabber.org/streams”命名空间,因为它也使用了“stream:”前缀。请注意,它不必重新声明流前缀,因为它还从其父元素继承了一个前缀列表,因此只需应用没有 re-defining 的前缀就可以了。
从您提供的详细程度无法判断,但您可能需要将 xmlns="jabber:client"
添加到您的根元素。如果您没有要将其添加到的根元素(即,当您使用发送大量单独 XML 文档而不是一个长流的 websocket 协议时),则必须单独将其应用到您发送的每一帧中的根元素。