使用 SoapClient 时,遇到错误:looks like we got no XML document

今天,在跟外部对接的接口的时候,又遇到这个问题了。就在今年的3月份才碰到过,那时候没解决,没想到还是会重新捡起来。

首先,网上基本就是这么几种解决方案:
1、安装 soap 扩展
2、修改 php.ini 配置 always_populate_raw_post_data = -1
3、修改 SoapClient 调用时的版本参数,如下:

new SoapClient($wsdl, ['soap_version'=> SOAP_1_1]);

却没解决我遇到的问题,偶然间看到这种处理方式,如下:

class SoapClientNG extends \SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $xml = explode("\r\n", parent::__doRequest($request, $location, $action, $version, $one_way));

        return preg_replace('/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFE\xFF|\xFF\xFE|\xEF\xBB\xBF)/', "", $xml[0]);
    }
}

试了一下,发现还是不行。无奈之下,我试着把 $xml 打印出来,发现响应的不是 xml ,居然是一个字符串:“没有权限访问相关服务!”

哎,真是吐血!!!

参考资料:
stackoverflow.com/questions/431395...
gist.github.com/egulhan/9346678

突然想到,xdebug 是不是能调试出来?

讨论数量: 2
南城以南

最近刚接触这个。你可以用直接发送xml的方式 www.cnblogs.com/qhorse/p/8884538.h...

4年前 评论
浮心 (楼主) 4年前

我也遇到这个问题了,跟这解决方法类似

XML解析不了某些UTF8的字符,所以会报错“looks like we got no XML document”,这看起来我们获取的不是一个XML文档。

说明服务端接收到的不是一个合格的XML文档。只能从请求的数据入手,也就是__doRequest这个方法。

如楼主一样,打印一下XML格式,发现很乱,这可咋整?

没办法,格式化一下,慢慢找吧,船到桥头自然直

用网上的格式化网站菜鸟格式化c.runoob.com/front-end/710

格式化后,文档又长又多,咋办?

我发现一个网站可以识别这类的问题,于是把格式化的文档粘贴了进去tool.oschina.net/codeformat/xml

如果不格式化直接扔进去,可能没办法获取准确的行号。

定位到错误行,就好找了,发现有个特殊的【空格】被解析成了【】XML文档是不识别的,然后str_replace替换成【‘’】就行了

4年前 评论
浮心 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!