gpt4 book ai didi

SOAP 响应模式验证

转载 作者:行者123 更新时间:2023-12-03 15:03:50 25 4
gpt4 key购买 nike

短版:

我正在尝试编写一个 XSD 来验证我的 SOAP 服务的响应。我觉得必须只导入 http://schemas.xmlsoap.org/soap/envelope/而不是重新定义信封、头部和正文等 SOAP 元素,但是 Body 的 xmlsoap.org 架构定义对我来说太宽泛了- - 一旦我导入 SOAP 模式,我的 XSD(我已经为我的服务精心定制的)突然验证了所有 SOAP 消息。

我应该如何处理 XSD 中 SOAP 信封、头部、主体的定义?

我怀疑问题在于我正在尝试重用其他不应该重用的模式。当然,这些 SOAP 模式旨在定义(所有)SOAP 消息应该是什么样子。也许我只需要在我的模式中定义我希望我的特定 SOAP 体看起来像什么。

我可能刚刚回答了我自己的问题。也许有人有不同的解决方案?

加长版:

我在创作 XSD 来描述来自我的一个 SOAP 服务的响应消息时遇到了一点麻烦。

这是我正在尝试验证的服务的示例响应:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<helloResponse xmlns="http://justinfaulkner/wsdl/1.0">
<Message>Hello, Justin!</Message>
<Message>Your lucky numbers are: 329, 9</Message>
</helloResponse>
</soap:Body>
</soap:Envelope>

我的目标是使用 XSD 验证来自我的服务的响应。
所以,我手工编写了一个 XSD,它描述了属于我的服务 SOAP 的所有类型:Body
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://justinfaulkner/wsdl/1.0" xmlns:tns="http://justinfaulkner/wsdl/1.0">
<xsd:complexType name="helloResponseType">
<xsd:sequence>
<xsd:element name="Message" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="helloResponse" type="tns:helloResponseType"/>
</xsd:schema>

当我尝试使用 PHP 的 DOMDocument::schemaValidateSource() 功能验证带有模式(第二个片段)的示例响应(第一个 XML 片段)时,验证器指出了我的第一个明显错误:

Element 'soap:Envelope': No matching global declaration available



“哎呀,呃,”我想,“这些元素是在 SOAP 的命名空间中定义的,所以我需要导入 SOAP 的 XSD。”

所以我编辑了我的 XSD 并添加了一个导入:
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>

它奏效了!当我使用 XSD 验证 soap 响应时,DOMDocument::schemaValidateSource 返回 true。

然后,作为健全性检查 ,我采取了不同的 SOAP react XSD 我躺在周围:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://justinfaulkner/wsdl/1.0" xmlns:tns="http://justinfaulkner/wsdl/1.0">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
<xsd:complexType name="OtherServiceResponseType">
<xsd:all>
<xsd:element name="CompletionCode" type="xsd:string"/>
<xsd:element name="ResponseMessage" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:element name="OtherServiceResponse" type="tns:OtherServiceResponseType"/>
</xsd:schema>

我试图用这个完全不相关的模式来验证我的 SOAP react ......

乍一看,根本没有描述此消息的架构 还验证了 SOAP 响应。

然后我意识到 XSD 的模式一定是响应针对这两种不同模式进行验证的原因。我从 http://schemas.xmlsoap.org/soap/envelope/ 导入的 SOAP 模式将 Body 元素定义为:
<xs:element name="Body" type="tns:Body" />
<xs:complexType name="Body" >
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="lax" >
<xs:annotation>
<xs:documentation>
Prose in the spec does not specify that attributes are allowed on the Body element
</xs:documentation>
</xs:annotation>
</xs:anyAttribute>
</xs:complexType>

这允许 Body 标签的内容基本上是任何东西。

这是有道理的,XSD 的 XSD 的目的是定义所有 XSD 的外观,而不仅仅是我的。

所以我的问题是,如果可能的话,我应该如何构建一个 XSD 来验证这些 SOAP 响应,并重用现有的 SOAP XSD?

这是我一直追求的方向...
  • 我想我可以将 xmlsoap.org 的 XSD 模式抛到窗外,自己重新定义 Envelope 和 Body,准确指定 Body 元素中应该显示的内容。但我觉得我最终基本上会在我自己的 XSD 中拥有所有 SOAP 元素的副本,头部和 body 的定义略有不同,这感觉就像违反了 DRY。
  • 有没有办法可以导入 xmlsoap.org 的 XSD,然后从我的 XSD 中覆盖soap:Body 的定义?
  • 最佳答案

    您应该使用 SOAP Web 服务框架来执行此操作。 wikipedia page 上列出了许多适用于各种编程语言的内容。 .您编写一个 WSDL 来指定您的 Web 服务 API,并在其中导入您的 XSD 以定义有效负载格式(契约(Contract)优先方法)。使用框架提供的 wsdl2xxx 工具生成 API stub。您编写 API 实现代码。框架将负责其余的工作(处理 SOAP 消息并绑定(bind)到您的实现代码)。

    关于SOAP 响应模式验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4019244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com