0

私の client.py は次のようになります。

from SOAPpy import WSDL
wsdlFile = 'D:/Downloads/w1.1.wsdl'
server = WSDL.Proxy(wsdlFile) 
server.soapproxy.config.dumpSOAPOut = 1     
server.soapproxy.config.dumpSOAPIn = 1
result = server.packageRequest({'wrongParameter': 'wrong value'})
print result 

そして私のserver.py:

import SOAPpy
def packageRequest(data):
    return "Hello World"
server = SOAPpy.SOAPServer(("localhost", 8080))
server.registerFunction(packageRequest)
server.serve_forever()

最も重要なのはw1.1.wsdlです。これは、入力データなどの制限を定義するためです。

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2013 sp1 (http://www.altova.com) by Krzysztof (Wroclaw University of Technology) -->
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://new.webservice.namespace" targetNamespace="http://new.webservice.namespace">
    <wsdl:types>
        <xs:schema targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified"/>
        <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified">
            <xsi:element name="request">
                <xsi:complexType>
                    <xsi:sequence>
                        <xsi:element name="info">
                            <xsi:complexType>
                                <xsi:attribute name="company" type="xs:integer" use="required"/>
                                <xsi:attribute name="packageId" type="xs:integer" use="required"/>
                                <xsi:attribute name="storehouseId" type="xs:integer" use="required"/>
                                <xsi:attribute name="giving" type="xs:dateTime" use="required"/>
                                <xsi:attribute name="send" type="xs:dateTime" use="required"/>
                                <xsi:attribute name="weight" type="xs:integer" use="required"/>
                                <xsi:attribute name="unit" type="xs:string" use="required"/>
                            </xsi:complexType>
                        </xsi:element>
                        <xsi:element name="recipient">
                            <xsi:complexType>
                                <xsi:sequence>
                                    <xsi:element name="firstname" type="xs:string"/>
                                    <xsi:element name="lastname" type="xs:integer"/>
                                    <xsi:element name="street" type="xs:string"/>
                                    <xsi:element name="city" type="xs:string"/>
                                    <xsi:element name="zip">
                                        <xsi:simpleType>
                                            <xsi:restriction base="xs:string">
                                                <xsi:pattern value="[0-9]{2}-[0-9]{3}"/>
                                            </xsi:restriction>
                                        </xsi:simpleType>
                                    </xsi:element>
                                </xsi:sequence>
                            </xsi:complexType>
                        </xsi:element>
                        <xsi:element name="sender">
                            <xsi:complexType>
                                <xsi:sequence>
                                    <xsi:element name="firstname" type="xs:string"/>
                                    <xsi:element name="lastname" type="xs:string"/>
                                    <xsi:element name="street" type="xs:string"/>
                                    <xsi:element name="city" type="xs:string"/>
                                    <xsi:element name="zip">
                                        <xsi:simpleType>
                                            <xsi:restriction base="xs:string">
                                                <xsi:pattern value="[0-9]{2}-[0-9]{3}"/>
                                            </xsi:restriction>
                                        </xsi:simpleType>
                                    </xsi:element>
                                </xsi:sequence>
                            </xsi:complexType>
                        </xsi:element>
                    </xsi:sequence>
                </xsi:complexType>
            </xsi:element>
        </xsi:schema>
        <xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified">
            <xs:element name="response">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="companyId"/>
                        <xs:element name="packageId"/>
                        <xs:element name="packageGivingDate"/>
                        <xs:element name="responseSendDate"/>
                        <xs:element name="packageWeight"/>
                        <xs:element name="packageUnit"/>
                        <xs:element name="recipient">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="firstName"/>
                                    <xs:element name="lastName"/>
                                    <xs:element name="city"/>
                                    <xs:element name="zip"/>
                                    <xs:element name="street"/>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="sender">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="firstName"/>
                                    <xs:element name="lastName"/>
                                    <xs:element name="city"/>
                                    <xs:element name="zip"/>
                                    <xs:element name="street"/>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="request">
        <wsdl:part name="parameter" element="tns:request"/>
    </wsdl:message>
    <wsdl:message name="response">
        <wsdl:part name="parameter" element="tns:response"/>
    </wsdl:message>
    <wsdl:portType name="NewPortType">
        <wsdl:operation name="packageRequest">
            <wsdl:input message="tns:request"/>
            <wsdl:output message="tns:response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="NewBinding" type="tns:NewPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="packageRequest">
            <soap:operation soapAction="packageRequest" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="NewService">
        <wsdl:port name="NewPort" binding="tns:NewBinding">
            <soap:address location="http://localhost:8080/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

client.py を実行すると、"Hello World!" という応答が返されます。なんで?入力データが間違っているというエラーが予想されます (WDSL は company、packageId、storehouseId のような入力データを定義します ... しかし、役に立たない辞書{'wrongParameter': 'wrong value'}しか与えません)

私は何を間違えましたか?WSDL 検証が機能しないのはなぜですか?

4

1 に答える 1

0

WSDL 検証が機能しないのはなぜですか?

Web サービスが何らかのデータを取り込み、"Hello World!" を出力するためです。ストリング。それだけです。

私の言いたいことを理解するために、サーバー コードを次のように変更し、SOAP メッセージと得られる結果を見てください。

import SOAPpy

def packageRequest(data):
    result = {"HelloWorld": "Message from server"}
    if isinstance(data, str):
        result["plainString"] = data
    else:
        result.update([(k, v) for k, v in data.__dict__.iteritems() if not k.startswith("_")])
    return result

server = SOAPpy.SOAPServer(("localhost", 8080))
server.registerFunction(packageRequest)
server.serve_forever()

メソッドを適切に実装し、packageRequest検証を自分で処理する必要があります。WSDL はそれとは何の関係もありません。

Web サービスは、ネットワーク上で公開される一連の操作です。適切にフォーマットされた SOAP メッセージを受け入れ、SOAP メッセージを出力します。しかし、クライアントが Web サービスを呼び出す必要がある場合、どのようにしてメッセージのフォーマットを知るのでしょうか? WSDL を入力してください!

WSDL を使用して、Web サービスと正常に対話するためにクライアントが従わなければならない契約を記述します。ドキュメントの形式として、また Web サービスの呼び出し方法を認識しているクライアント スタブを自動的に生成する方法として使用されます。

WSDL を使用してサーバー スケルトンを生成することもできますが、SOAPpy でそれができるかどうかはわかりません (クライアント側のプロキシしか作成できないと思います)。そのため、自分で実装を行い、不適切な形式のメッセージを拒否する必要があります。

于 2013-01-06T18:17:06.667 に答える