Python 这个SOAP响应与WSDL/XSD一致吗?
我正在向(内部)soap服务发送请求。我目前正在测试(Jurko的fork)和python soap库。两者都无法封送响应 对成功请求的原始xml响应为:Python 这个SOAP响应与WSDL/XSD一致吗?,python,soap,suds,Python,Soap,Suds,我正在向(内部)soap服务发送请求。我目前正在测试(Jurko的fork)和python soap库。两者都无法封送响应 对成功请求的原始xml响应为: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:geocodeAddressResponse xmlns:ns2="http://geocodegateway"> <g
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:geocodeAddressResponse xmlns:ns2="http://geocodegateway">
<geocodedAddress>
<streetLine>1 SOME STREET</streetLine>
<suburb>SOMEBURB</suburb>
<state>SS</state>
<postcode>1234</postcode>
<x>111.222222</x>
<y>-22.333333</y>
</geocodedAddress>
etc...
如果我通过一个SUDS MessagePlugin钩子修改响应XML来包装街道、郊区等。。。元素,然后SUDS正确封送响应
<xs:complexType name="geocodeAddressResponse">
<xs:sequence>
<xs:element name="responseCode" type="xs:string" maxOccurs="1" minOccurs="1"/>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
或者,如果我使用suds DocumentPlugin钩子(如下所示)修改XSD以删除地址类型并包括单独的街道、郊区等。。。元素,然后SUDS正确封送响应
<xs:complexType name="geocodeAddressResponse">
<xs:sequence>
<xs:element name="responseCode" type="xs:string" maxOccurs="1" minOccurs="1"/>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
我向soap服务的开发人员建议,也许应该修改XSD或XML响应,使它们保持一致,但有人建议它们似乎是正确的,并检查我使用的python soap库是否正确地指定/解释了document/literal vs document/literal包装(我不确定这在这里是如何应用的)
问题:SOAP响应是否与WSDL/XSD和python SOAP库一致?是否没有正确解释它(或者我没有正确使用它们)?原始XML响应没有与WSDL内联 类型和元素之间可能存在混淆: WSDL中捆绑的XSD的这一部分定义了一个名为“address”的类型:
鉴于同一XSD的这一部分定义了一个元素,该元素在geocodedAddress中也称为“地址”,属于上文定义的“地址”类型:
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address" nillable="true" type="gns:address"></xs:element>
因此,根据该定义,原始soap响应应该如下所示:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:geocodeAddressResponse xmlns:ns2="http://geocodegateway">
<geocodedAddress>
<address>
<streetLine>1 SOME STREET</streetLine>
<suburb>SOMEBURB</suburb>
<state>SS</state>
<postcode>1234</postcode>
<x>111.222222</x>
<y>-22.333333</y>
</address>
</geocodedAddress>
<xs:complexType name="geocodeAddressResponse">
<xs:sequence>
<xs:element name="responseCode" type="xs:string" maxOccurs="1" minOccurs="1"/>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
一条街
萨默伯
党卫军
1234
111.222222
-22.333333
没有单独的gns:address类型定义的geocodedAddress的等价物如下:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:geocodeAddressResponse xmlns:ns2="http://geocodegateway">
<geocodedAddress>
<address>
<streetLine>1 SOME STREET</streetLine>
<suburb>SOMEBURB</suburb>
<state>SS</state>
<postcode>1234</postcode>
<x>111.222222</x>
<y>-22.333333</y>
</address>
</geocodedAddress>
<xs:complexType name="geocodeAddressResponse">
<xs:sequence>
<xs:element name="responseCode" type="xs:string" maxOccurs="1" minOccurs="1"/>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
你是对的,这是不一致的 选项1 如果XSD如下所示:
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address" nillable="true" type="gns:address"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<address>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
</address>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
XML应该如下所示:
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address" nillable="true" type="gns:address"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<address>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
</address>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
第一街
郊区1
XX
1234
111.11
-22.22
选项2
如果XSD如下所示:
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address" nillable="true" type="gns:address"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<address>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
</address>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
XML应该如下所示:
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="address" nillable="true" type="gns:address"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<address>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
</address>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
<xs:element name="geocodedAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetLine" type="xs:string"></xs:element>
<xs:element name="suburb" type="xs:string"></xs:element>
<xs:element name="state" type="xs:string"></xs:element>
<xs:element name="postcode" type="xs:string"></xs:element>
<xs:element name="x" type="xs:string"></xs:element>
<xs:element name="y" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<geocodedAddress>
<streetLine>Street 1</streetLine>
<suburb>Suburb 1</suburb>
<state>XX</state>
<postcode>1234</postcode>
<x>111.11</x>
<y>-22.22</y>
</geocodedAddress>
第一街
郊区1
XX
1234
111.11
-22.22