我可以让Axis2生成一个带有'unwrapped'类型的WSDL吗?

时间:2009-11-12 19:04:31

标签: php web-services soap wsdl axis2

我正在尝试使用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")."!";

我的问题是双重的:为什么会发生这种情况?我该怎么做才能阻止它呢? :)

以下是生成的wsdl的类型,消息和porttype部分:

<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>

3 个答案:

答案 0 :(得分:1)

我正在寻找同样的问题而没有找到解决方案。它似乎是某种类型的axis2哲学,以产生这种蹩脚的界面,我发现这是非常难以理解的。但我认为,在大多数情况下,你会接受它。如果您不喜欢这样并在应用程序中大量使用Web服务,那么请编写一个这样的包装类:

class soapHelloWebservice {
   public function sayHello($username) {
      $client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
      $parameters["username"] = $username;
      return $client->sayHello($parameters)->return;
   } 
}

答案 1 :(得分:1)

这称为文档/文字包装模式。请参阅this documentthis one.

基本上,当使用document / literal请求编码时,客户端不一定发送它正在调用的Web服务操作的名称。服务器必须从请求对象中找出它。为确保服务器可以执行该操作,为每个Web服务操作定义了不同的请求对象。

答案 2 :(得分:0)

使用WSDL2JAVA命令行工具(与Axis2捆绑在一起)生成客户端代码时,添加参数&#39; -uw &#39;要解包参数,即不是在bean中设置参数,而只需将它们作为方法参数发送。

我们一直在项目中使用它。