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

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

15 голосов
/ 26 октября 2010

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

Я пытаюсь написать 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-ответов, используя, если возможно, существующие XAP-SOAP?

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

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

1 Ответ

0 голосов
/ 29 июля 2018

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

...