我正在学习SOAP。我看到一些头元素有一个“mustunderstand”属性,可以设置为true或false。但是,“理解”肥皂信息意味着什么?要解析它没有错误?我找到了一些don't really explain it的网站。
有人可以告诉我发生了什么事吗?
答案 0 :(得分:14)
要调用Web服务,您需要尊重它的合同。如果网络服务有<operationA>
和<operationB>
,但您向其发送<operationC>
,则会收到错误(SOAP用语错误)。
网络服务包含操作<operationA>
和<operationB>
,并知道在邮件包含<operationA>
或<operationB>
时如何处理邮件。但它没有<operationC>
,并且不知道如何处理包含<operationC>
的消息,因此它只返回错误。不能忽略不正确的正文,但另一方面,标题对它们的含义没有限制,因此您需要一种不同的机制才能正确处理它们。
标头用于通过添加事务支持,身份验证,路由等扩展消息。但是这些扩展没有在SOAP规范中定义,它们是用户定义的。规范只是说标题用于此目的,还指定了标题存在时必须如何处理消息。 mustUnderstand
属性是“应如何处理邮件”的一部分。
SOAP消息可以通过沿着消息路径传递一组SOAP中介,从发起者传播到最终目的地。标头可以针对特定节点或最终节点(即SOAP 1.1 actor
属性或SOAP 1.2 role
属性),当发生这种情况时,节点必须对标头执行某些操作。这可以是使用它,也可以忽略它。
mustUnderstand
属性指示标头的处理是可选的还是必需的。这基本上转换为尝试查找与标头匹配的适当处理程序的节点,并继续以与其规范一致的方式处理消息。如果找不到合适的处理程序,则必须返回错误并停止进一步处理。如果mustUnderstand
为真/ 1,则不允许该节点忽略它。
例如,假设标题用于事务语义(即,必须在事务中执行调用,以便以原子方式执行操作,要么全部成功,要么全部失败)。如果处理节点看到事务头,则应该启动该事务。想象一下,如果节点看到标题但不知道它是什么会发生什么,所以它决定忽略它并且没有启动任何事务。 稍后,某些操作失败而其他操作失败,并且没有要回滚的事务。所以现在你的应用程序处于不一致的状态。
SOAP mustUnderstand属性允许强大的演变。使用值为“1”的SOAP mustUnderstand属性标记的元素必须假定以某种方式修改其父元素或对等元素的语义。以这种方式标记元素可以确保语义的这种变化不会被那些可能不完全理解它的人默默地(并且可能被错误地)忽略。