Проверка схемы ответа SOAP

Укороченная версия:

Я пытаюсь написать XSD, который проверит ответы моей службы SOAP. Я чувствую себя обязанным просто импортировать http:// schemas.xmlsoap.org/soap/envelope/ вместо переопределения элементов SOAP, таких как Envelope, Head и Body, но это определение схемы Body для xmlsoap.org слишком широкое для моего использования. - как только я импортирую схему SOAP, внезапно мой XSD (который я тщательно адаптировал к своему сервису) проверяет все сообщения SOAP.

Как мне обращаться с определением конверта SOAP, головы, тела в моем XSD?

Я подозреваю, что проблема в том, что я пытаюсь повторно использовать другие схемы, которые я не должен пытаться использовать повторно. Конечно, эти схемы для 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, который описывает все типы, которые принадлежат мылу моего сервиса: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>

Когда я попытался проверить пример ответа (первый фрагмент XML) с помощью схемы (второй фрагмент) с помощью функциональности PHP DOMDocument::schemaValidateSource(), валидатор указал на мою первую очевидную ошибку:

Элемент soap:Envelope: нет подходящего глобального объявления

"Ой, да, - подумал я, - эти элементы определены в пространстве имен SOAP, поэтому мне нужно импортировать XSD SOAP".

Поэтому я отредактировал свой XSD и добавил импорт:

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

И это сработало! DOMDocument::schemaValidateSource возвращает true, когда я проверяю ответ мыла с помощью XSD.

Затем, в качестве проверки работоспособности, я взял другой 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>

И я попытался подтвердить свой мыльный ответ с помощью этой совершенно не связанной схемы...

И схема, которая, на первый взгляд, вообще не описывает это сообщение, также подтверждает правильность ответа мыла.

Затем я понимаю, что схема XSD должна быть причиной, по которой ответ проверяется на соответствие этим двум различным схемам. Схема SOAP, которую я импортирую из http://schemas.xmlsoap.org/soap/envelope/ определяет элемент 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?

Вот направление, которое я преследовал...

  • Думаю, я мог бы выбросить XSD-схему xmlsoap.org из окна и переопределить Envelope и Body самостоятельно, указав, что именно должно отображаться в элементе Body. Но я чувствую, что в итоге у меня будет копия всех мыльных элементов в моем собственном XSD, с немного другим определением головы и тела, и это похоже на нарушение DRY.
  • Есть ли способ, которым я могу импортировать XSD из xmlsoap.org, но затем переопределить определение soap:Body изнутри моего XSD?

1 ответ

Вы должны использовать платформу веб-службы SOAP для этого. Есть много разных языков программирования, перечисленных на странице википедии. Вы пишете WSDL, чтобы указать API своего веб-сервиса, и в котором вы импортируете свой XSD, чтобы определить форматы полезной нагрузки (подход по контракту). Используйте инструмент wsdl2xxx, предоставляемый платформой, для создания заглушки API. Вы пишете код реализации API. Фреймворк позаботится обо всем остальном (обработка сообщений SOAP и привязка к вашему коду реализации).

Другие вопросы по тегам