1

私はWSDL 1.1仕様を読んでいましたが、奇妙に思えることが 1 つあります。(WS-I Basic Profile のほかに) これを実行できない理由は次のとおりです。

<message name="helloRequest">
    <part name="arg1" type="xs:string" />
</message>
<message name="helloResponse">
    <part name="result" type="xs:string" />
</message>

<portType name="Port02">
    <operation name="hello">
        <input message="tns:helloRequest" name="helloRequest" />
        <output message="tns:helloResponse" name="helloResponse" />
    </operation>
</portType>

<binding name="Port02SoapBinding" type="tns:Port02">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="hello">
        <input name="helloRequest">
            <soap:body use="literal" />
        </input>
        <output name="helloResponse">
            <soap:body use="literal" />
        </output>
    </operation>
</binding>

ドキュメント/リテラル​​ Web サービスですが、in/out メッセージには、グローバル要素ではなく、XSD (単純) 型を参照する部分が含まれています。

WSDL フラグメントはそれほど恐ろしいものではありません。Axis1 と CXF の両方が、パーツ名から派生した名前を持つ SOAP 本体要素を生成しますが、WSDL 1.1、3.5: soap:bodyは次のように述べています。

use がリテラルの場合、各パーツは element または type 属性を使用して具体的なスキーマ定義を参照します。最初のケースでは、[...]。2 番目の部分では、パーツによって参照される型が、囲んでいる要素のスキーマ型になります (ドキュメント スタイルの場合は Body、rpc スタイルの場合はパーツ アクセサー要素)。

結果の SOAP メッセージ (WSDL 仕様による) は次のようになります (SOAP 本文内のテキスト コンテンツ) ということですか?

<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    xmlns:xs="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body xsi:type="xs:string">value</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
4

1 に答える 1

1

それはエッジケースです-実際には、私がチェックしたすべてのJava(axis1、axis2、cxf、jaxrpc-ri)の実装は、名前空間のない部分の名前にちなんで名付けられた要素を持つ文字列(または任意の単純な)型をラップします。

軸1:

private static void _initOperationDesc1(){
    org.apache.axis.description.OperationDesc oper;
    org.apache.axis.description.ParameterDesc param;
    oper = new org.apache.axis.description.OperationDesc();
    oper.setName("hello");
    param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
    oper.addParameter(param);
    oper.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
    oper.setReturnClass(java.lang.String.class);
    oper.setReturnQName(new javax.xml.namespace.QName("", "result"));
    oper.setStyle(org.apache.axis.constants.Style.DOCUMENT);
    oper.setUse(org.apache.axis.constants.Use.LITERAL);
    _operations[0] = oper;
}

JAXRPC-RI:

SOAPBlockInfo _bodyBlock = new SOAPBlockInfo(ns1_hello_arg1_QNAME);
_bodyBlock.setValue(arg1);
_bodyBlock.setSerializer(ns2_myns2_string__java_lang_String_String_Serializer);
_request.setBody(_bodyBlock);
...
private static final javax.xml.namespace.QName ns1_hello_arg1_QNAME = new QName("", "arg1");

したがって、次のようになります。

<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
    xmlns:xs="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body>
       <arg1>value</arg1>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

編集: また、WSDL 2.0 にはメッセージがなく、操作の入力と出力は要素 (または #any または #none または #other) を参照する必要があります。

于 2012-06-13T09:03:31.430 に答える