SoapClient 返回“NULL”,但 __getLastResponse() 返回 XML

问题描述 投票:0回答:3

下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得正确的输出。

有人知道这里出了什么问题吗?谢谢! :)

这是我的代码:

$options = array(
  "trace" => true,
  "encoding" => "utf-8"
);
$client = new SoapClient("http://opendap.co-ops.nos.noaa.gov/axis/webservices/highlowtidepred/wsdl/HighLowTidePred.wsdl", $options);

$params = array(
    "stationId" => 8454000,
    "beginDate" => "20060921 00:00",
    "endDate" => "20060922 23:59",
    "datum" => "MLLW",
    "unit" => 0,
    "timeZone" => 0
);

try {
 $result = $client->getHLPredAndMetadata($params);
 echo $client->__getLastResponse();
}
catch (Exception $e) {
  $error_xml =  $client->__getLastRequest();
  echo $error_xml;
  echo "\n\n".$e->getMessage();
}
var_dump($result);
php web-services soap
3个回答
5
投票

$result
(或对 SoapCall 的响应)为
null
确实是因为 WSDL 无效。

我刚刚遇到了同样的问题 - WSDL 说响应应该是

PackageChangeBatchResponse
但实际的 XML 返回有
PackageChangeResponse

更改 WSDL 以匹配响应/更改响应以匹配 WSDL 可解决问题


2
投票

你应该给出一个选项参数,如下所示:

<?php 
// below $option=array('trace',1); 
// correct one is below 
$option=array('trace'=>1); 

$client=new SoapClient('some.wsdl',$option); 

try{ 
  $client->aMethodAtRemote(); 
}catch(SoapFault $fault){ 
  // <xmp> tag displays xml output in html 
  echo 'Request : <br/><xmp>', 
  $client->__getLastRequest(), 
  '</xmp><br/><br/> Error Message : <br/>', 
  $fault->getMessage(); 
} 
?> 

“trace”参数启用请求的输出。现在,您应该看到 SOAP 请求。 (来源:PHP.net


0
投票

我也有同样的问题。如果我对 WSDL 地址使用curl,我会得到响应。然而,当通过 PHP 代码访问 WSDL 时,会触发错误。问题最终出在 CA 证书上。 php.init 文件中有一个“openssl.cafile”设置,它指向 WSDL 端点拒绝的特定证书。

当我注释掉这一点时 - 通过粘贴“;”在 /etc/php.ini 文件中的 openssl.cafile 设置中,并反弹 Apache,通过 PHP 代码的 WSDL 连接起作用了。

由于curl有效并且没有覆盖证书的选项(即没有使用-k选项)并且它有效,那么您就知道服务器级别设置对于该WSDL端点是有效的。

希望这是有道理的,并且对那里的人有一些帮助。

© www.soinside.com 2019 - 2024. All rights reserved.