1

我在使用 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 构造函数来定义肥皂版本,但这没有帮助。我也尝试过将跟踪参数设置为 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;

}
4

2 回答 2

1

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

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

于 2012-06-29T19:45:47.387 回答
0

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

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

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

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

于 2012-06-28T18:27:47.770 回答