从现有WSDL创建SOAP服务器返回NULL

时间:2015-05-28 09:09:57

标签: php web-services soap wsdl

我需要使用OCPP - 协议从系统的现有WSDL文件创建一个中央系统(SOAP服务器)。(开放式充电点协议)

我已经成功地在非wsdl-mode和wsdl-mode中编写测试SOAP服务器和客户端,但是当我尝试使用现有的WSDL时,我得到的是一大堆错误(不能告诉我们我很多)

WSDL files可以在这里找到(中央系统充电点。抱歉,无法发布更多链接..)

我已经修复了一些错误,但无法解决这个问题 我猜 server.php 有错误并且没有返回任何内容,但我不知道为什么或如何使其工作。

为什么服务器无法识别请求或此处发生了什么?

的var_dump(的 $客户端 - > __ getLastRequestHeaders());

  

string(201)" POST /testi/OCPPServer.php HTTP / 1.1主机:127.0.0.1   连接:Keep-Alive User-Agent:PHP-SOAP / 5.6.8内容类型:   应用/肥皂+ xml的;字符集= UTF-8;行动=" /心跳"   内容长度:276"

的var_dump(的 $客户端 - > __ getLastRequest());

  

string(276)" 1234"

的var_dump(的 $客户端 - > __ getLastResponseHeaders());

  

NULL

的var_dump(的 $客户端 - > __ getLastResponse()获得);

  

NULL

以下是我的代码:

server.php

<?php

ini_set("soap.wsdl_cache_ttl", "0"); 
header("Content-type:text/xml");

# This class handles OCPP central system functions
class OCPPFunctions {

    public function Heartbeat() {
        #$date = date('Y-m-d H:i:s');
        #return array('currentTime' => $date);
        #return $date;      

        #test datetime
        return array('currentTime' => '2010-10-10T10:10:10Z');


  }

    public function BootNotification($params) {
        $result['RegistrationStatus'] = "Accepted";
        $result['currentTime'] = "";
        $result['heartbeatInterval'] = 100000;
        return $result;
    }
}

    $server = new SoapServer("http://127.0.0.1/testi/ocppcp.wsdl", 
        array('trace' => 1));
    $server->setClass('OCPPFunctions'); 
    $server->handle(); 


?>

client.php

<?php 
ini_set("soap.wsdl_cache_ttl", "0"); 

$wsdl_local = "http://127.0.0.1/testi/ocppcs.wsdl";

$client = new SoapClient($wsdl_local,
  array('trace' => 1 ,
     'soap_version' => SOAP_1_2,
     'location' => 'http://127.0.0.1/testi/server.php'));

$header = new SoapHeader('urn://Ocpp/Cs/2012/06/', 'chargeBoxIdentity',    '1234' );
$client->__setSoapHeaders($header);

var_dump($client->__getFunctions());
echo '<br>';
try {
    $result = $client->__soapCall('Heartbeat', array());
    echo $result;
} catch(SoapFault $e) {
    var_dump($e);
}
?>

SoapFault var_dump($ e)我得到的是:

  

对象(SoapFault)#3(9){[&#34; message&#34;:protected] =&gt; string(27)&#34; Error Fetching&gt; http headers&#34; [&#34;串&#34;:&#34;例外&#34;:私人] =&GT; string(0)&#34;&#34; &GT; [&#34;代码&#34;:保护] =&GT; int(0)[&#34; file&#34;:protected] =&gt; string(58)&#34; /Applications/XAMPP/xamppfiles/htdocs/testi/OCPPClient.php" [&#34;线&#34;:保护] =&GT; int(21)[&#34; trace&#34;:&#34; Exception&#34;:private] =&gt; array(2){[0] =&gt; array(4){[&#34; function&#34;] =&gt; string(11)&#34; __ doRequest&#34; [&#34;类&#34;] =&GT; string(10)&#34; SoapClient&#34; [&#34;类型&#34;] =&GT; string(2)&#34; - &gt;&#34; [&#34; ARGS&#34;] =&GT; array(5){[0] =&gt;字符串(276)&#34; 1234&#34; [1] =&GT; string(37)&#34; http:// localhost /testi/OCPPServer.php" [2] =&GT; string(10)&#34; / Heartbeat&#34; [3] =&GT; int(2)[4] =&gt; int(0)}} [1] =&gt; array(6){[&#34; file&#34;] =&gt; string(58)&#34; /Applications/XAMPP/xamppfiles/htdocs/testi/OCPPClient.php" [&#34;线&#34;] =&GT; int(21)[&#34; function&#34;] =&gt; string(10)&#34; __ soapCall&#34; [&#34;类&#34;] =&GT; string(10)&#34; SoapClient&#34; [&#34;类型&#34;] =&GT; string(2)&#34; - &gt;&#34; [&#34; ARGS&#34;] =&GT; array(2){[0] =&gt; string(9)&#34; Heartbeat&#34; [1] =&GT; array(1){[&#34; foo&#34;] =&gt; string(3)&#34; bar&#34; }&#34; previous&#34;:&#34; Exception&#34;:private] =&gt; NULL [&#34; faultstring&#34;] =&gt; string(27)&#34;错误获取http标头&#34; [&#34;的faultcode&#34;] =&GT; string(4)&#34; HTTP&#34; }

任何帮助或提示都将不胜感激!

1 个答案:

答案 0 :(得分:0)

var_dump(client);

如果返回NULL,则表示它是网络问题;如果返回您的Soap通话详细信息,则不是代码问题。

它很可能出现在您的soap options数组中,因为如果我没记错的话,uri和options仅在wdsl为空值(NON-WDSL MODE)时使用