我在使用 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 定义,以便可以检查是否是这种情况。