我正在尝试使用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>
答案 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 document和this one.
基本上,当使用document / literal请求编码时,客户端不一定发送它正在调用的Web服务操作的名称。服务器必须从请求对象中找出它。为确保服务器可以执行该操作,为每个Web服务操作定义了不同的请求对象。
答案 2 :(得分:0)
使用WSDL2JAVA命令行工具(与Axis2捆绑在一起)生成客户端代码时,添加参数&#39; -uw &#39;要解包参数,即不是在bean中设置参数,而只需将它们作为方法参数发送。
我们一直在项目中使用它。