从soap响应中删除BOM角色:SOAP:看起来我们没有XML文档

时间:2015-07-13 10:20:14

标签: xml web-services soap byte-order-mark

您好我是创建网络服务的开始,

我正在尝试使用soap协议创建一个Web服务,并且我不断收到以下错误:看起来我们没有XML文档。

以下是我的网络服务和响应输出。正如你会看到我在回应的开始时得到了bom字符(￿¿),我认为这是错误的根本原因,指定xml是无效的。请问有什么方法从我的客户端删除这些字符。所以我注意到我试图覆盖SoapClient的_doRequest方法,但没有成功。我的wsdl文件和服务器脚本都以UTF-8编码,没有BOM。

非常感谢任何解决此问题的帮助。

问候。

客户:

try{
    ini_set("soap.wsdl_cache_enabled", "0");// disabling WSDL cache
    libxml_disable_entity_loader(false);
    if(!extension_loaded("soap")){ dl("php_soap.dll");  }
    $client2 = new SoapClient("http://www.payafrik.com/PayAfrikAPI.wsdl",array("wsdl_cache"=>0,"trace"=>1,"exception"=>1));
    $slabrequest["email"]  = "tes@gmail.com";
    $slabrequest["description"] = "test";
    $slabrequest["montant"]    = 50000;
    $client2->slabAccount($slabrequest);
}catch(Exception $e){ 
    var_dump( $e ); 
    echo "<pre>"; echo "Request :<br/>", htmlentities($client2->__getLastRequest()), "<br/>"; 
    echo "Response :<br/>", htmlentities($client2->__getLastResponse()), "<br/>";echo "</pre>";
}   

.. 响应输出: 的 repSUCCESSuser4MonsieurGNACADJALoic 1RUE 1382LITTORAL1229COTONOU22921332680229972461401987-03-26loic.gnacadja@gmail.com646260ea6e66c61704c695e617f9b74alogin1309625000011242015-07-12 23:50:30

2 个答案:

答案 0 :(得分:0)

这是一个有点老问题,但有同样的问题,所以我会解决这个问题,以防有人在这里被Google指示:)

不仅仅是BOM,而且在XML数据之前的任何额外数据(如新行)都会使 SoapClient 报告此错误。通常我们只是某些服务的客户,因此我们无法更改我们获得的消息或服务器配置。

对我有用的解决方案

通过将 SoapClient 跟踪设置为true,并调用SoapClient::__getLastResponse,我发现有趣的部分是从&lt; s:Envelope 开始 要删除额外的,不需要的数据,必须扩展 SoapClient ,仅删除所需信息,让 SoapClient 完成剩下的工作,并获得有效结果。

结束了像这样简单的事情:

class WSDLSoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $response = parent::__doRequest( $request, $location, $action, $version );
        if (!$response) {
            return $response;
        }
        // Cut only part that is a SOAP result
        $matches = array();
        preg_match('/<s:Envelope.*<\/s:Envelope>/s', $response, $matches);
        return $matches[0];
    }
}

希望它有所帮助, 干杯

答案 1 :(得分:0)

ob_start();
try(){
    //
}catch(){
   //
}finally(){
  ob_end_clean();
}
//Use finally block with ob_end_clean() function to clean BOM characters