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