0

我对 SOAP 有非常基本的了解,对我来说,我认为 SOAP 是两个不同人的翻译器,他们都说不同的语言,试图相互交流。我正在尝试使用 PHP SOAP CLIENT 从 Web 服务调用一个方法,但我无法让它工作,下面是 Web 服务服务器生成的 WSDL:

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://server.webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="serviceServerService" targetNamespace="http://server.webservice.com/">
<wsdl:types>
<schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://server.webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://server.webservice.com/" schemaLocation="http://127.0.0.1:8080/WebbServiceServer/services/serviceServerPort?xsd=serviceserver_schema1.xsd"/>
</schema>
</wsdl:types>
<wsdl:message name="userInputResponse">
<wsdl:part element="tns:userInputResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="userInput">
<wsdl:part element="tns:userInput" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:portType name="serviceInterface">
<wsdl:operation name="userInput">
<wsdl:input message="tns:userInput" name="userInput"></wsdl:input>
<wsdl:output message="tns:userInputResponse" name="userInputResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="serviceServerServiceSoapBinding" type="tns:serviceInterface">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="userInput">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="userInput">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="userInputResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="serviceServerService">
<wsdl:port binding="tns:serviceServerServiceSoapBinding" name="serviceServerPort">
<soap:address location="http://127.0.0.1:8080/WebbServiceServer/services/serviceServerPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

我从上面的 WSDL 中了解到,我试图调用的方法是userInput接受字符串参数的方法,并且userInputResponse是来自服务器的响应,它将输出userInput返回的任何方法。下面是我尝试运行的 PHP CLIENT 的代码:

<?php
$a = array("userInput" => "This is the input");
$client = new SoapClient("http://127.0.0.1:8080/WebbServiceServer/services/serviceServerPort?wsdl", array('exceptions' => 0));

$result = $client->userInput($a);
//$functions = $client->__getFunctions();
//var_dump($client->__soapCall("userInput", $a));
//var_dump($functions);

print_r($result->userInputResponse);

if (is_soap_fault($result)) {
    trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
}
?>

我尝试运行 PHP CLIENT 不幸的是它打印了错误:

Notice: Undefined property: stdClass::$userInputResponse in C:\xampp\htdocs\PHP_SOAP_CLIENT\index.php on line 14

为了测试客户端是否调用了userInput我使用的方法,var_dump()如果返回了一些东西:

var_dump($result);

输出是:

object(stdClass)#2 (1) { ["return"]=> string(56) "Hi! this is from JAVA Web services, your input was: null" }

很好,它确实返回了一些东西,但是该方法没有得到我传递的字符串。我希望有人可以识别和解释我的代码的缺陷,非常感谢任何评论和答案,谢谢。

4

1 回答 1

0

您访问返回值的尝试是错误的。正如userInputResponse您在var_dump(). 实际上,返回值存储在属性return中。

我真的看不出这是在 WSDL 中定义的,但我认为它是不完整的。有一个对另一个 XSD 的引用,它也可能被加载并且可以包含进一步的定义。

于 2013-03-11T21:18:50.063 回答