使用PHP调用SOAP API的GetAllVill接口返回值异常求助
解决方案
问题根因
你当前拿到的接口返回属于正常响应,问题出在PHP内置SoapClient没有自动解析.NET平台返回的DataSet类型结果,将DataSet的序列化内容直接存储到了any属性中。
调整步骤
方案1:基于原生SoapClient优化解析逻辑
- 第一步:初始化SoapClient时补充配置参数,避免解析异常同时方便调试
$soapclient = new SoapClient('你的WSDL地址', [ 'trace' => 1, // 开启调试能力,可查看请求、响应的原始报文 'exceptions' => 1, // 开启异常抛出,方便快速定位错误 'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // 统一返回数组格式,避免单个元素时返回对象格式不一致 ]);
- 第二步:解析
any属性中的DataSet序列化内容
$param = [ 'strTaluka' => '你的实际参数值', 'Username' => '你的接口用户名', 'Password' => '你的接口密码' ]; $response = $soapclient->GetAllVill($param); // 取出DataSet对应的原始XML内容 $rawDataSetXml = $response->GetAllVillResult->any; // 加载XML并转为数组格式,处理非规范XML时关闭错误提示 libxml_use_internal_errors(true); $xmlObj = simplexml_load_string($rawDataSetXml); libxml_clear_errors(); // 转为关联数组方便后续业务处理 $formattedResult = json_decode(json_encode($xmlObj), true); // 输出规范结构化结果 var_dump($formattedResult);
- 第三步(可选):打印原始报文确认返回内容
如果解析结果不符合预期,可以调用SoapClient的调试方法查看原始报文,确认服务端返回是否符合规范:
// 打印原始请求报文 echo "请求报文:" . htmlspecialchars($soapclient->__getLastRequest()) . "<br>"; // 打印原始响应报文 echo "响应报文:" . htmlspecialchars($soapclient->__getLastResponse()) . "<br>";
方案2:直接使用CURL模拟SOAP请求
如果原生SoapClient的封装逻辑持续导致解析问题,可以直接按照官方示例构造请求报文发送,完全避开Soap封装的解析逻辑:
// 构造符合官方要求的请求XML $requestXml = <<<XML <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAllVill xmlns="http://apps.in/wsror"> <strTaluka>你的实际参数值</strTaluka> <Username>你的接口用户名</Username> <Password>你的接口密码</Password> </GetAllVill> </soap:Body> </soap:Envelope> XML; $apiUrl = 'http://10.159.159.1/wsror/Form.asmx'; $headers = [ 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: http://apps.in/wsror/GetAllVill', 'Content-Length: ' . strlen($requestXml) ]; // 初始化CURL发送请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 忽略SSL证书校验(如果是HTTPS接口且证书不规范可开启) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $responseXml = curl_exec($ch); curl_close($ch); // 解析响应内容 libxml_use_internal_errors(true); $soapObj = simplexml_load_string($responseXml); libxml_clear_errors(); // 提取指定命名空间下的返回结果 $bodyContent = $soapObj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body; $resultContent = $bodyContent->children('http://apps.in/wsror')->GetAllVillResponse->GetAllVillResult; // 输出规范结果 var_dump($resultContent);
内容的提问来源于stack exchange,提问作者sahilver
相关产品推荐
相关产品推荐

