PHP SOAP WSDL模式在方法调用上返回Null

时间:2014-03-01 15:40:08

标签: php web-services soap wsdl

我一直在尝试用PHP学习SOAP,而非wsdl模式很好用。我把它们包含在寻求学习的人的信息中。

公开library.php的类

<?php
  class Library {
    public function getDwarves(){
      $dwarves = array("Bashful","Doc","Dopey");
        return $dwarves;
      }
      public function greetUser($name){
         return array("message"=>"hello,".$name);
      }
    }
 ?>

非wsdl客户端

<?php
try{
  $options = array("location" => "http://192.168.1.20/ws/server.php" , "uri" => "http://192.168.1.20/ws");
 $client=new SoapClient(null,$options);
  $dwarves = $client->getDwarves();
  echo nl2br("Result of getDwarves:\n"); 
  var_dump($dwarves);
  echo nl2br("\n\n");

  $greeting = $client->greetUser("Fairmutex");
  echo nl2br("Result of greetUser:\n"); 
  var_dump($greeting);
  echo nl2br("\n\n");

}catch(SoapFault $e){

 var_dump($e);
 echo  "<br/>".$e->getMessage()."<br/>"; 

}
?>

非wsdl服务器

<?php
   require('library.php');
   $options = array("uri" => "http://192.168.1.20");
   $server = new SoapServer(null,$options);
   $server->setClass('Library');
   $server->handle();
?>

然而,当WSDL被引入图片时,服务器返回NULL作为方法调用的结果。谁能帮我识别我做错了什么?

server.php

<?php
   require('library.php');
   $server = new SoapServer("wsdl");
   $server->setClass('Library');
   $server->handle();
?>

client.php

<?php
try{

  $client=new SoapClient("http://192.168.1.20/ws/wsdl",array( "trace" => 1 ) );
  $dwarves = $client->getDwarves();
  echo nl2br("Result of getDwarves:\n"); 
  var_dump($dwarves);
  echo nl2br("\n\n");

  $greeting = $client->greetUser("Fairmutex");
  echo nl2br("Result of greetUser:\n"); 
  var_dump($greeting);
  echo nl2br("\n\n");

}catch(SoapFault $e){

 var_dump($e);
 echo  "<br/>".$e->getMessage()."<br/>"; 

}
?>
带有调试信息的

client.php

    <?php
try{
$client=new SoapClient("http://192.168.1.20/ws/wsdl",array( "trace" => 1 ) );
$dwarves = $client->getDwarves();

 echo nl2br("GetFunctions:\n");  var_dump($client->__getFunctions()); echo nl2br("\n\n");
 echo nl2br("GetTypes:\n");  var_dump($client->__getTypes()); echo nl2br("\n\n");
 echo nl2br("Request Header:\n" . htmlentities(str_ireplace('><', ">\n<",    $client->__getLastRequestHeaders())) . "\n");
 echo nl2br("REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n");
  echo nl2br("Response Header:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponseHeaders())) . "\n");
echo nl2br("Response:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n");

echo nl2br("Result of getDwarves:\n"); 
 var_dump($dwarves);
 echo nl2br("\n\n");

 $greeting = $client->greetUser("Fairmutex");
 echo nl2br("REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n");
   echo nl2br("Response Header:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponseHeaders())) . "\n");
echo nl2br("Response:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n");
echo nl2br("Result of greetUser:\n"); 
 var_dump($greeting);
 echo nl2br("\n\n");
}catch(SoapFault $e){
 var_dump($e);
 echo  "<br/>".$e->getMessage()."<br/>"; 
}
?>

WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:typens="urn:LibraryWSDL" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="LibraryWSDL" targetNamespace="urn:LibraryWSDL">
   <message name="getDwarves" />
   <message name="getDwarvesResponse" />
   <message name="greetUser">
      <part name="name" type="xsd:anyType" />
   </message>
   <message name="greetUserResponse" />
   <portType name="LibraryPortType">
      <operation name="getDwarves">
         <input message="typens:getDwarves" />
         <output message="typens:getDwarvesResponse" />
      </operation>
      <operation name="greetUser">
         <input message="typens:greetUser" />
         <output message="typens:greetUserResponse" />
      </operation>
   </portType>
   <binding name="LibraryBinding" type="typens:LibraryPortType">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
      <operation name="getDwarves">
         <soap:operation soapAction="urn:LibraryAction" />
         <input>
            <soap:body namespace="urn:LibraryWSDL" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:LibraryWSDL" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="greetUser">
         <soap:operation soapAction="urn:LibraryAction" />
         <input>
            <soap:body namespace="urn:LibraryWSDL" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:LibraryWSDL" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
   </binding>
   <service name="LibraryWSDLService">
      <port name="LibraryPort" binding="typens:LibraryBinding">
         <soap:address location="http://192.168.1.20/ws/server.php" />
      </port>
   </service>
</definitions>

路径:

http://192.168.1.20/ws/wsdl
http://192.168.1.20/ws/server.php
http://192.168.1.20/ws/client.php

来自调试信息客户端的结果

GetFunctions:
array(2) { [0]=> string(17) "void getDwarves()" [1]=> string(29) "void greetUser(anyType $name)" }

GetTypes:
array(0) { }

Request Header:
POST /ws/server.php HTTP/1.1
Host: 192.168.1.20
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.3-7+squeeze14
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:LibraryAction"
Content-Length: 385


REQUEST:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:LibraryWSDL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getDwarves/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Response Header:
HTTP/1.1 200 OK
Date: Sat, 01 Mar 2014 00:45:39 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze14
Content-Length: 393
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8

Response:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:LibraryWSDL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getDwarvesResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Result of getDwarves:
NULL

REQUEST:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:LibraryWSDL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:greetUser>
<name xsi:type="xsd:string">Fairmutex</name>
</ns1:greetUser>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Response Header:
HTTP/1.1 200 OK
Date: Sat, 01 Mar 2014 00:45:39 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze14
Content-Length: 392
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/xml; charset=utf-8

Response:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:LibraryWSDL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:greetUserResponse/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Result of greetUser:
NULL 

1 个答案:

答案 0 :(得分:0)

PHP SOAP可能会非常令人沮丧,因为您可能遇到的大多数错误都很模糊,因此难以调试。

在WSDL模式下使用PHP SOAP时,必须注意以下几点。必须在WSDL文件中(在#34;类型&#34;标记或&#34;消息&#34;标记中)和PHP代码中明确定义PHP函数的输入和输出参数(作为类定义)。

您的实施中缺少这两个要求。您的调试输出信息($ client-&gt; __ getFunctions())也指出了错误,因为您会注意到返回&#34;类型&#34;方法getDwarves()和greetUser()都是&#34; void&#34;。这意味着即使您的PHP函数定义返回值,当您调用这些方法中的任何一个时,PHP SOAP也将返回null(void)。

有关详细信息,请查看Creating PHP SOAP server in WSDL mode

上的简单教程