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

斯嘉莉

我一直试图在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 
欧萨罗·加布里埃尔(Osaro Gabriel)

由于您可能会遇到的大多数错误都是模棱两可的,因此很难调试,因此PHP SOAP的使用可能会非常令人沮丧。

在WSDL模式下使用PHP SOAP时,必须注意几件事。必须在WSDL文件(“ types”标记或“ message”标记中)和PHP代码(作为类定义)中明确定义PHP函数的输入和输出参数。

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

有关更多信息,请查看有关以WSDL模式创建PHP SOAP服务器的简单教程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SOAP WSDL php请求

来自分类Dev

PHP(SOAP错误:解析WSDL)

来自分类Dev

PHP SOAP返回数组值

来自分类Dev

返回Soap服务器php的soap xml响应

来自分类Dev

PHP中的非WSDL SOAP请求

来自分类Dev

php soap调用中的嵌套参数

来自分类Dev

使用PHP Soap进行Zoyto API调用

来自分类Dev

如何为SOAP调用创建PHP数组?

来自分类Dev

PHP SOAP不断返回旧结果

来自分类Dev

PHP:SOAP-未找到返回的HTTP

来自分类Dev

PHP中的SOAP调用返回int(...),string(...)格式的输出。

来自分类Dev

无法设置php_value'soap.wsdl_cache_dir'

来自分类Dev

PHP SOAP请求不适用于WSDL

来自分类Dev

PHP致命错误:SOAP错误:解析WSDL:无法来回加载

来自分类Dev

如何从 PHP 中的 SOAP WebService 的 WSDL 创建对象?

来自分类Dev

如何使用 Savon Gem 将使用 PHP 的调用 SOAP wsdl API 移植到 Rails

来自分类Dev

PHP SOAP请求问题

来自分类Dev

PHP XML Soap请求

来自分类Dev

PHP SOAP shippinglabelservice

来自分类Dev

PHP中的Soap Client

来自分类Dev

PHP SOAP 响应

来自分类Dev

PHP xPath 解析 SOAP

来自分类Dev

SOAP wsdl 返回 404 not found

来自分类Dev

PHP-SOAP客户端无法调用HTTPS端点

来自分类Dev

SOAP调用PHP不发送所有参数

来自分类Dev

PHP使用客户端证书调用Soap函数

来自分类Dev

PHP-SOAP客户端无法调用HTTPS端点

来自分类Dev

从Android Phonegap调用PHP SOAP Web服务中的操作

来自分类Dev

PHP SOAP Server无法读取输入值(返回empy)?