为什么xsd模式无法使用限制maxLength验证字符串长度

时间:2014-09-16 15:57:19

标签: web-services xsd soapui xsd-validation

我正在开发一个Web服务SOAP并且我已经定义了我的xsd模式和wsdl文件,我希望通过修复他的最大值来验证元素comment(其类型是字符串)长度。但是当我使用SoapUI验证请求时,在我看来xsd架构并没有验证字符串的最大长度。

以下是我的xsd架构的语法:

<xsd:element name="comment" minOccurs="0">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="20"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

任何人都知道为什么?提前谢谢。

1 个答案:

答案 0 :(得分:5)

SOAPUI正确验证SOAP请求对其xsd的正确性,但是如果你发送的话,你必须进行有目的的验证,选择右键单击SOAP Request窗口的验证选项(如上图所示)。直接请求而不验证它,SOAPUI只是发送请求,即使它是一个错误的xml,因为SOAPUI是一个测试工具,你可能想要故意发送一个错误的请求来测试你的WS。

我在maxLength中使用<restriction> <xs:string>制作了一个示例,我得到了以下结果(我使用SOAPUI 4.5.2):

enter image description here

要执行此操作,请使用以下wsdl

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:impl="sample:wsdl"
    xmlns:dss="sample:schema"
    targetNamespace="sample:wsdl" name="dss">
    <!-- Schema Type Definitions -->
    <types>
        <xs:schema xmlns:dss="sample:schema" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="sample:schema" elementFormDefault="qualified" 
        attributeFormDefault="unqualified">
            <!-- COMMON PROTOCOL STRUCTURES -->
            <xs:element name="comment" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:maxLength value="20"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:schema>        
    </types>
    <!--Messages-->
    <message name="CommentRequest">
        <part name="CommentRequest" element="dss:comment"/>
    </message>
    <!-- PortTypes -->
    <portType name="SOAPport">
        <operation name="doComment">
            <input message="impl:CommentRequest"/>
            <output message="xs:anyType"/>
        </operation>    
    </portType> 
    <!-- Bindings -->
    <binding name="SOAPBinding" type="impl:SOAPport">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="doComment">
            <soap:operation/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <!--Service definition-->
    <service name="doCommentService">
        <port name="dssPortSoap" binding="impl:SOAPBinding">
            <soap:address location="http://testing.stackoverflow.answer"/>
        </port>
    </service>
</definitions>

正如您在wsdl评论请求中看到maxLength <restriction>的跟随架构:

<xs:schema xmlns:dss="sample:schema" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="sample:schema" elementFormDefault="qualified" 
            attributeFormDefault="unqualified">
    <!-- COMMON PROTOCOL STRUCTURES -->
    <xs:element name="comment" minOccurs="0">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="20"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

然后我从wsdl创建一个新的SOAPUI项目并添加一个SOAP请求,如果我在<comment/>中放入一个超过20个字符的字符串并按下右键单击SOAP Request窗口并选择Validate它会在第一张图片中显示错误消息:

enter image description here

希望这有帮助,