0

PHP クライアントを使用して、Hello World AXIS2 SOAP Web サービスを使用しようとしています。Java クラスは Netbeans で記述され、AXIS2 aar ファイルは Netbeans AXIS2 プラグインを使用して生成されます。

前に見たことがありますが、ここに Java クラスがあります。

public class SOAPHello {    
    public String sayHello(String username) {
        return "Hello, "+username;
    }  
}

AXIS2 によって生成された wsdl はすべてのパラメーターをラップしているように見えるため、サービスを使用するときは、次のようなおかしな PHP スクリプトを使用する必要があります。

$client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
$parameters["username"] = "Dave";
$response = $client->sayHello($parameters)->return;
echo $response."!";

私が本当にやりたいことがすべてあるとき

   echo $client->sayHello("Dave")."!";

私の質問は 2 つあります。なぜこれが起こっているのですか? それを止めるにはどうすればよいですか?:)

生成された wsdl のタイプ、メッセージ、およびポートタイプのセクションは次のとおりです。

<wsdl:types>
   <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://soap.axis2.myhost.co.uk">
      <xs:element name="sayHello">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="username" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
      <xs:element name="sayHelloResponse">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
   </xs:schema>
</wsdl:types>

<wsdl:message name="sayHelloRequest">
   <wsdl:part name="parameters" element="ns:sayHello"/>
</wsdl:message>    
<wsdl:message name="sayHelloResponse">
   <wsdl:part name="parameters" element="ns:sayHelloResponse"/>
</wsdl:message>

<wsdl:portType name="SOAPHelloPortType">
   <wsdl:operation name="sayHello">
      <wsdl:input message="ns:sayHelloRequest" wsaw:Action="urn:sayHello"/>
      <wsdl:output message="ns:sayHelloResponse" wsaw:Action="urn:sayHelloResponse"/>
   </wsdl:operation>
</wsdl:portType>
4

3 に答える 3

1

これは、ドキュメント/リテラル​​ ラップ パターンと呼ばれます。このドキュメントとこのドキュメントを参照してください

基本的に、ドキュメント/リテラル​​ リクエスト エンコーディングを使用する場合、クライアントは、呼び出している Web サービス操作の名前を送信するとは限りません。サーバーは、リクエスト オブジェクトからそれを把握する必要があります。サーバーがそれを実行できるようにするために、Web サービス操作ごとに異なる要求オブジェクトが定義されています。

于 2012-03-01T20:27:46.933 に答える
0

WSDL2JAVA コマンドライン ツール (Axis2 にバンドルされている) を使用してクライアント コードを生成する場合、パラメーター ' -uw ' を追加してパラメーターをアンラップします。つまり、パラメーターを Bean に設定する代わりに、単にメソッド パラメーターとして送信します。

プロジェクトでは常にこれを使用します。

于 2014-11-24T10:17:14.570 に答える