SOAP 在主体内重新声明 qname

发布于 2024-12-26 11:20:28 字数 1700 浏览 2 评论 0原文

我有一个这种形式的 SOAP 请求:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest xmlns:myqname="http://example.com/hello">
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

如果我要求 SOAPUI“格式化 XML”此请求, 它删除了 myqname 的第二个声明,所以我得到这个:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest>
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

原始请求工作正常, 但应用程序服务器因修改后的请求而失败,并出现以下错误:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: UndeclaredPrefix: Cannot resolve 'myqname:MyRequest' as a QName: the prefix 'myqname' is not declared.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

根据 Web 服务规范, 是否必须在soapenv:Body 节点内重新声明qname? 这是 SOAPUI 错误还是应用程序服务器错误?还是我的误解?

SOAPUI 4.0.1,WebLogic服务器版本:10.3.2.0

编辑:ups,即使使用WebLogic应用程序服务器,我也使用CXF Web服务框架。我在那里发布了这个问题。 issues.apache.org/jira/browse/CXF-4026

所以:SOAPUI 4.0.1,CXF 2.5.0

I have a SOAP request of this form:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest xmlns:myqname="http://example.com/hello">
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

If I ask SOAPUI to "Format XML" this request,
it removes the second declaration of myqname, so I get this:

<soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:myqname="http://example.com/hello" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <myqname:MyRequest>
         ...
      </myqname:MyRequest>
   </soapenv:Body>
</soapenv:Envelope>

The original request works fine,
but the Application Servers fails with the modified request with this error:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: UndeclaredPrefix: Cannot resolve 'myqname:MyRequest' as a QName: the prefix 'myqname' is not declared.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

According to the web services specification,
is it mandatory for the qname to be re-declared inside the soapenv:Body node?
Is this a SOAPUI bug, or an Application Server bug? or a misunderstanding from my part?

SOAPUI 4.0.1, WebLogic Server Version: 10.3.2.0

Edit: ups, even if using WebLogic application server, I was using the CXF web services framework. I posted the issue there. issues.apache.org/jira/browse/CXF-4026

So: SOAPUI 4.0.1, CXF 2.5.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长不大的小祸害 2025-01-02 11:20:29

我将其描述为代码中剥离 SOAP 信封的错误;它应该保留命名空间上下文,但它没有这样做,这破坏了 XML。我猜这是因为它是通过获取子字符串来进行剥离,而不是在 DOM 元素级别进行操作(无论是否使用 DOM 处理来进行剥离都不是重点)。我不确定哪个组件正在执行剥离,因为这些东西可以嵌套,但我怀疑它是 WebLogic…


[编辑]:我已经检查了 SOAP 规范 并没有说正文的内容必须直接声明所使用的命名空间(请参阅§5.3.1),尽管它确实说它应该命名空间。因此,应用正常的 XML 命名空间规则 — 整个 SOAP 消息只是一个 XML 文档 — 这将使 WebLogic 的行为成为一个错误。

I'd describe it as a bug in the code that strips the SOAP envelope; it should preserve the namespace context yet it isn't doing so, and that's breaking the XML. I guess that's because it is doing the stripping by taking a substring rather than operating at the DOM element level (whether or not it's using DOM processing to do the stripping is beside the point). I'm not sure which component is doing that stripping because of the way these things can be nested, but I suspect it's WebLogic…


[EDIT]: I've checked the SOAP specification and it does not say that the contents of the body has to directly declare the namespace used (see §5.3.1), though it does say that it SHOULD be namespaced. Because of that, normal XML namespacing rules apply — the whole SOAP message is simply an XML document — and that would make WebLogic's behavior a bug.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文