从SoapFault获取糟糕的WSDL?

时间:2016-06-13 15:51:37

标签: php soap-client

我正在使用SoapClient连接到第三方服务。大部分时间它工作正常,但每隔一段时间,也许每100-150次呼叫一次,我得到错误

  

肥皂失败:SOAP-ERROR:解析架构:complexType中的意外

我的代码在try / catch中重试,它将在下一轮中运行。但是我想检查一下WSDL以找出失败的原因,部分是因为我自己的好奇心,以及我需要将它传递给我正在连接的公司。我可以从SoapFault获取该信息吗?或者我是否必须调用URL来获取字符串?我担心如果我事后得到WSDL,它可能已经修复了。

$pass = FALSE;
$this->soap = NULL;
$this->session = NULL;
do {
    try {
        Doc::i("Starting session");
        $this->soap = new SoapClient($this->wsdl_url, ['trace' => 1]);
        $pass = TRUE;
    } catch (\SoapFault $e) {
        Doc::e('Soap Failed: ' . $e->getMessage());
        if(str_contains($e->getMessage(),'Parsing Schema') && !empty($e->detail)) {
            Doc::e($e->detail); // Something new I'm trying to see if it helps
        }
    } catch (FatalErrorException $e) {
        Doc::e("Soap failed really bad: " . $e->getMessage());
    } catch (\Exception $e) {
        Doc::e("Soap failed bad: " . $e->getMessage());
    }
} while (!$pass);

1 个答案:

答案 0 :(得分:0)

您应该可以使用$this->soap->__getLastResponse(),因为您将'trace' => 1选项传递给SoapClient

您可能还会考虑记录$this->soap->__getLastRequest以及这两者的标头版本,以确保您在运行时捕获尽可能多的信息。

有关可能的选项,请参阅SoapClient方法列表。请记住这里的诀窍是trace选项:没有它,这些都不会返回任何有用的东西!