php soapclient返回null但getPreviousResults有正确的结果

时间:2012-06-28 18:21:16

标签: php soap

我遇到了SOAP问题,我之前从未遇到过这个问题,也找不到任何有助于我解决问题的信息。

以下代码

$wsdl = "path/to/my/wsdl";
$client = new SoapClient($wsdl, array('trace' => true));
//$$textinput is passed in and is a very large string with rows in <item></item> tags
$soapInput = new SoapVar($textinput, XSD_ANYXML);
$res = $client->dataprofilingservice(array("contents" => $soapInput));
$response = $client->__getLastResponse();

var_dump($res);//outputs null
var_dump($response);//provides the proper response as I would expect.

我已经尝试将params传递给SoapClient构造函数来定义soap版本,但这并没有帮助。我也尝试将trace param设置为false并且不存在,因为预期使$ response为null但$ res仍为null。我已经在运行Apache的Linux和Windows安装上尝试了代码。

WSDL中的函数定义是(xxxx是出于安全原因)

<portType name="xxxxServiceSoap">
 <operation name="dataprofilingservice">
  <input   message="tns:dataprofilingserviceSoapIn"/>
  <output message="tns:dataprofilingserviceSoapOut"/>
 </operation>
</portType>

我让它使用__getLastResponse()工作,但它让我烦恼它将无法正常工作。

我已经整理了一个小测试脚本,有人在这里看到任何问题。我是否需要返回类型的结构?

//very simplifed dataset that would normally be 
//read in from a CSV file of about 1mb
$soapInput = getSoapInput("asdf,qwer\r\nzzxvc,ewrwe\r\n23424,2113");
$wsdl = "path to wsdl";

try {
  $client = new SoapClient($wsdl,array('trace' => true,'exceptions' => true));

} catch (SoapFault $fault) {
  $error = 1;
  var_dump($fault);
} 

try {
    $res = $client->dataprofilingservice(array("contents" => $soapInput));
    $response = $client->__getLastResponse();
    echo htmlentities($client->__getLastRequest());//proper request echoed
    echo '<hr>';
    var_dump($res);//null

    echo "<hr>";
    echo(htmlentities($response));//proper response echoed
} catch (SoapFault $fault) {
    $error = 1;
    var_dump($fault);

}         
function getSoapInput($input){
$rows = array();
    $userInputs = explode("\r\n", $input);

    $userInputs = array_filter($userInputs);
    //
    $inputTemplate = " <contents>%s</contents>";
    $rowTemplate = "<Item>%s</Item>";
    //
    $soapString = "";
    foreach ($userInputs as $row) {
        // sanitize
        $row = htmlspecialchars(addslashes($row));
        $xmlStr = sprintf($rowTemplate, $row);
        $rows[] = $xmlStr;
    }
    $textinput = sprintf($inputTemplate, implode(PHP_EOL, $rows));
    $soapInput = new SoapVar($textinput, XSD_ANYXML);

   return $soapInput;

}

2 个答案:

答案 0 :(得分:1)

好的经过深入挖掘它与相对命名空间有关,看起来PHP在WSDL或SOAP Envelope中没有很好地处理它们。因此,由于我无法控制SOAP服务器,因此我将通过__getLastResponse();继续获取响应。

希望这可以节省一些人很难找到的时间。

答案 1 :(得分:0)

你在这里混合东西。如果您使用__getLastResponse()选项,'trace' => true将从服务器返回裸XML字符串响应。这仅用于调试。

因此无论是否'trace' => true,您最初要调用的方法都返回相同,这是完全正常的。将跟踪设置为on不会改变行为,它只是提供了一个额外的功能,__getLastResponse()的返回值。

由于SoapClient没有抛出任何异常,我会说你的电话没问题,NULL是有效的返回值。

可能想要提供实际的XML字符串和/或WSDL定义,以便人们可以检查是否是这种情况。