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

Краткая версия:

Я пытаюсь написать XSD, который будет проверять мои ответы службы SOAP. Я вынужден просто импортировать http://schemas.xmlsoap.org/soap/envelope/вместо переопределения SOAP-элементов, таких как Envelope, Head и Body, но это определение схемы xmlsoap.org для Body слишком велико для моего использования - - как только я импортирую схему 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) с помощью Schema (второй фрагмент) с использованием функции PHP DOMDocument:: schemaValidateSource(), валидатор указал на мою первую очевидную ошибку:

Element 'soap: Envelope': нет доступной глобальной декларации

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

Итак, я отредактировал свой 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 Schema должна быть причиной, по которой ответ проверяет эти две разные схемы. Схема 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, если возможно, использование существующих SOA XSD?

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

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

Ответ 1

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