PHP SOAP не улавливает ошибку SAP PI / XI SOAP - PullRequest
0 голосов
/ 15 декабря 2011

Я делаю SOAP-запрос к веб-сервису SAP PI. Этот сервис возвращает ошибку SOAP, например:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
       <SOAP:Body>
          <SOAP:Fault>
             <faultcode>SOAP:Server</faultcode>
             <faultstring>Server Error</faultstring>
             <detail>
                <s:SystemError xmlns:s="http://sap.com/xi/WebService/xi2.0">
                   <context>XIAdapter</context>
                   <code>ADAPTER.JAVA_EXCEPTION</code>
                   <text>com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn't retrieve binding for the given channelId: Binding:CID=null;
        at com.sap.aii.af.service.cpa.impl.lookup.AbstractLookupManager.getBindingByChannelId(AbstractLookupManager.java:173)
        at com.sap.aii.adapter.soap.web.MessageServlet.doPost(MessageServlet.java:449)
        ....
        at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:327)</text>
                </s:SystemError>
             </detail>
          </SOAP:Fault>
       </SOAP:Body>
</SOAP:Envelope>

В PHP я следую:

$client = new SoapClient('path/to/wsdl', array(
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'login' => 'some_login',
            'password' => 'some_password',
        ));
$result = $client->some_funtion("bla-bla-bla");
var_dump($result);

и выведите null , но следует исключение

Если я вывожу тот же xml (ошибка мыла) в моем собственном веб-сервисе, я поймаю это нормально.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Проблема была в выводе тега в WSDL. Я добавил этот тег, и он решил мою проблему

<wsdl:portType name="...">
     <wsdl:operation name="...">
         ...
         <wsdl:input message="..."/>
         <wsdl:output message="..."/> <!--- that tag-->
     </wsdl:operation>
</wsdl:portType>
0 голосов
/ 15 декабря 2011

Это потому, что у вас нет блока try / catch.

Попробуйте это:

$client = new SoapClient('path/to/wsdl', array(
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'login' => 'some_login',
            'password' => 'some_password',
        ));

try{
  $result = $client->some_funtion("bla-bla-bla");
} catch (SoapFault $e){
   exit('caught soap fault');
}
...