Является ли информация XSD для SOAP WSDL обязательной? - PullRequest
0 голосов
/ 13 ноября 2018

Обязателен ли файл XSD для SOAP WSDL? Если файл .xsd не является обязательным, то обязательно ли я помещаю информацию XSD в элемент типа WSDL?

Я написал собственный десериализатор / сериализатор XML и собственный генератор WSDL, который будет принимать функции python (которые были Type Hinted) и динамически генерировать WSDL на основе переданных ему функций.

 def example(arg1: str, arg2: int) -> str:
     code

Таким образом, сгенерированный мной WSDL верен, если предположить, что подсказки типов верны (кто бы ни написал модуль python и т. Д.). Я могу добавить функцию Python или несколько, и динамически генерировать WSDL. Последний оставшийся фрагмент - это тег типа. Эта вики-реклама о XSD заставляет меня думать, что создание генератора XSD или XSD будет тривиальным, поскольку оно также будет основано на подсказках типов функций, и поскольку все это является динамическим / неизвестным, никакие заранее сделанные предположения не могут быть сделаны для XSD.

XSD может использоваться для выражения набора правил, к которым относится документ XML должны соответствовать, чтобы считаться «действительным» в соответствии с этим схемы. Однако, в отличие от большинства других языков схемы, XSD также разработан с целью определения действительности документа будет производить сбор информации, привязанной к конкретным данным типы. Такой информационный набор после проверки может быть полезен при разработке программного обеспечения для обработки документов XML ....

Я рассмотрел несколько примеров WSDL, этот не использует XSD, но явно указывает типы внутри основного XML. Тогда я предполагаю, что если я не использую XSD, мне просто нужно добавить информацию в элемент WSDL Types? У меня есть эта информация, и я могу просто поместить сигнатуру типа функции внутрь

<?xml version="1.0"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:hy="http://www.herongyang.com/Service/"
  targetNamespace="http://www.herongyang.com/Service/">

  <wsdl:documentation>
    Hello_WSDL_11_SOAP.wsdl
    Copyright (c) 2007 HerongYang.com, All Rights Reserved.
  </wsdl:documentation>

  <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.herongyang.com/Service/">
      <xsd:element name="HelloRequest" type="xsd:string"/>
      <xsd:element name="HelloResponse" type="xsd:string"/>
    </xsd:schema>
  </wsdl:types>

  <wsdl:message name="helloInputMessage">
    <wsdl:part name="helloInputPart" element="hy:HelloRequest"/>
  </wsdl:message>
  <wsdl:message name="helloOutputMessage">
    <wsdl:part name="helloOutputPart" element="hy:HelloResponse"/>
  </wsdl:message>

  <wsdl:portType name="helloPortType">
    <wsdl:operation name="Hello">
      <wsdl:input name="helloInput"
        message="hy:helloInputMessage"/>
      <wsdl:output name="helloOutput"
        message="hy:helloOutputMessage"/>
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="helloBinding" type="hy:helloPortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Hello">
      <soap:operation
        soapAction="http://www.herongyang.com/Service/Hello"/>
      <wsdl:input name="helloInput">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="helloOutput">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="helloService">
    <wsdl:port name="helloPort" binding="hy:helloBinding">
      <soap:address
location="http://www.herongyang.com/Service/Hello_SOAP_11.php"/>
    </wsdl:port>
  </wsdl:service>

</wsdl:definitions>

РЕДАКТИРОВАТЬ: Вот еще один пример WSDL и их использование XSD также отличается, поскольку типы xsd просто добавляются в элементы сообщения и игнорируются в элементе типов. Это различие очень запутанное, и ничто через Google не предоставляет никакой конкретной информации для XSD и особенно для использования WSDL.

<definitions name="SoapResponder"
             targetNamespace="http://www.SoapClient.com/xml/SoapResponder.wsdl">
<types>
    <schema targetNamespace="http://www.SoapClient.com/xml/SoapResponder.xsd">
    </schema>
</types>
<message name="Method1">
    <part name="bstrParam1" type="xsd:string"/>
    <part name="bstrParam2" type="xsd:string"/>
</message>
<message name="Method1Response">
    <part name="bstrReturn" type="xsd:string"/>
</message>
<portType name="SoapResponderPortType"></portType>
<binding name="SoapResponderBinding" type="tns:SoapResponderPortType">
    <soap:binding style="rpc"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="Method1">
        <soap:operation soapAction="http://www.SoapClient.com/SoapObject"/>
        <input>
            <soap:body use="encoded"
                       namespace="http://www.SoapClient.com/xml/SoapResponder.xsd"
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </input>
        <output>
            <soap:body use="encoded"
                       namespace="http://www.SoapClient.com/xml/SoapResponder.xsd"
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </output>
    </operation>
</binding>
<service name="SoapResponder">
    <documentation>A SOAP service that echoes input parameters in the
        response
    </documentation>
    <port name="SoapResponderPortType" binding="tns:SoapResponderBinding">
        <soap:address
                location="http://www.soapclient.com/xml/soapresponder.wsdl"/>
    </port>
</service>
</definitions>
...