PHP soapclient 返回 null,但 getPreviousResults 具有正确的结果


php soapclient returns null but getPreviousResults has proper results

我在使用 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.

我尝试将参数传递到 SoapClient 构造函数中以定义 soap 版本,但这并没有帮助。 我也尝试过将跟踪参数设置为 false 并且不存在,正如预期的那样,它使$response为空,但$res仍然是空的。 我已经在运行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;
}

好吧,经过大量挖掘,它与相对命名空间有关,似乎 PHP 在 WSDL 或 SOAP 信封中不能很好地处理它们。 因此,由于我无法控制 SOAP 服务器,我将继续通过 __getLastResponse(); 获得响应。

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

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

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

由于SoapClient不会引发任何异常,因此我会说您的调用运行正常,并且NULL是一个有效的返回值。

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