Validation du schéma de réponse SOAP

Version courte:

Je suis en train d'écrire un XSD qui permettra de valider mon SAVON, les réponses du service. Je me sens obligé de simplement importer http://schemas.xmlsoap.org/soap/envelope de/au lieu de redéfinir le SAVON éléments comme l'Enveloppe, la Tête et le Corps, mais que xmlsoap.org définition de schéma de Corps est trop large pour mon utilisation, dès que j'ai importer le Schéma SOAP, tout à coup, mon XSD (que j'ai soigneusement adaptés à mon service) valide tous des messages SOAP.

Comment dois-je gérer la définition de l'enveloppe de SAVON, la tête, le corps dans mon XSD?

Je soupçonne que le problème est que je suis en train de ré-utiliser d'autres schémas que je ne devrais pas essayer de le ré-utiliser. Certes, ces Schémas pour le SAVON visent à définir ce que (tous) les messages SOAP devrait ressembler. Et peut-être que j'ai juste besoin de définir, dans mon schéma de ce que je veux de mon corps soap ressembler.

J'ai peut-être répondu à ma propre question. Peut-être que quelqu'un a une autre solution?

Version longue:

Je vais avoir un peu de mal à la création d'une XSD pour décrire le message de réponse de l'un de mes services SOAP.

Voici un exemple de réponse de mon service que je suis en train de valider:

<?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>

Mon objectif est de valider les réponses de mon service avec un XSD.
Donc, j'ai la main-auteur d'un XSD qui décrit tous les types qui appartiennent à mon service 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>

Quand j'ai essayé de valider l'exemple de réponse (premier fragment de code XML) avec le Schéma (2ème extrait) à l'aide de PHP DOMDocument::schemaValidateSource() de la fonctionnalité, le validateur a souligné ma première erreur évidente:

Élément "soap:Envelope': Pas de correspondance mondial de la déclaration à la disposition

"Oups, euh," j'ai pensé, "Ces éléments sont définis dans le SAVON de l'espace de noms, donc j'ai besoin d'importer du SAVON XSD."

J'ai donc édité mon XSD et a ajouté une importation:

<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>

Et cela a fonctionné! DOMDocument::schemaValidateSource renvoie true lorsque je valide la réponse soap avec le XSD.

Puis, comme un test de cohérencej'ai pris une autre réponse soap XSD j'avais traîner:

<?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>

Et j'ai essayé de valider ma réponse soap avec ce complètement sans rapport avec le Schéma...

Et le schéma qui, à première vue, n'est pas de décrire ce message à tous, valide également la réponse soap.

Puis je me rends compte que XSD Schéma doit être la raison pour laquelle la réponse est la validation de ces deux différents schémas. Le SAVON de schéma je suis l'importation à partir d' http://schemas.xmlsoap.org/soap/envelope/ définit l'élément de Corps:

<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>

Qui permet au contenu de la balise Body fondamentalement quoi que ce soit.

Qui fait sens, le but de XSD XSD est de définir ce que TOUS les XSDs devrait ressembler, et pas seulement la mienne.

Donc ma question est, comment devrait - je construire un XSD pour valider ces réponses SOAP, la réutilisation de l'existant SAVON XSDs si possible?

Ici est la direction que j'ai été la poursuite de...

  • Je suppose que je pourrais jeter xmlsoap.org's schéma XSD hors de la fenêtre et de redéfinir l'Enveloppe du Corps et de moi-même, en précisant exactement ce qui doit s'afficher dans l'élément Body. Mais je sens que je vais fondamentalement, en ayant une copie de tout le savon d'éléments à l'intérieur de mon propre XSD, avec un peu différente de la Tête et du Corps de définition, et qui se sent comme une violation de la SEC.
  • Est-il un moyen que je peux importer xmlsoap.org s'XSD mais ensuite remplacer la définition de savon:Corps de l'intérieur de mon XSD?

source d'informationauteur Justin

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *