我遇到了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;
}
答案 0 :(得分:1)
好的经过深入挖掘它与相对命名空间有关,看起来PHP在WSDL或SOAP Envelope中没有很好地处理它们。因此,由于我无法控制SOAP服务器,因此我将通过__getLastResponse();继续获取响应。
希望这可以节省一些人很难找到的时间。
答案 1 :(得分:0)
你在这里混合东西。如果您使用__getLastResponse()
选项,'trace' => true
将从服务器返回裸XML字符串响应。这仅用于调试。
因此无论是否'trace' => true
,您最初要调用的方法都返回相同,这是完全正常的。将跟踪设置为on不会改变行为,它只是提供了一个额外的功能,__getLastResponse()
的返回值。
由于SoapClient
没有抛出任何异常,我会说你的电话没问题,NULL
是有效的返回值。
你可能想要提供实际的XML字符串和/或WSDL定义,以便人们可以检查是否是这种情况。