PHP SOAP 无法捕获 SAP PI/XI SOAP 错误

发布于 2024-12-21 12:31:42 字数 1508 浏览 0 评论 0原文

我向 SAP PI Web 服务发出 SOAP 请求。该服务返回 SOAP 错误,如下所示:


   <肥皂:主体>
      
         <故障代码>SOAP:服务器
         服务器错误
         <详细>
            
               <上下文>XIAdapter
               <代码>ADAPTER.JAVA_EXCEPTION
               com.sap.aii.af.service.cpa.CPAObjectNotFoundException:无法
                       检索给定channelId的绑定:Binding:CID=null;
               在 com.sap.aii.af.service.cpa.impl.lookup.AbstractLookupManager.getBindingByChannelId(AbstractLookupManager.java:173)
               在 com.sap.aii.adapter.soap.web.MessageServlet.doPost(MessageServlet.java:449)
               ...
               在 com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:327)
            
         
      
   

在 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,但应该抛出异常。

如果我在自己的 Web 服务中输出相同的 XML(SOAP 错误),我会正确捕获它。

I do SOAP request to SAP PI web service. This service returns SOAP fault like that:

<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>

In PHP, I do as follows:

$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);

It prints null, but should throw an exception.

If I output the same XML (SOAP fault) in my own web service, I catch it correctly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妄想挽回 2024-12-28 12:31:42

问题出在 WSDL 中的 output 标记中。我添加了这个标签,它解决了我的问题

<wsdl:portType name="...">
     <wsdl:operation name="...">
         ...
         <wsdl:input message="..."/>
         <wsdl:output message="..."/> <!--- that tag-->
     </wsdl:operation>
</wsdl:portType>

The problem was in output tag in WSDL. I have added this tag and it solve my problem

<wsdl:portType name="...">
     <wsdl:operation name="...">
         ...
         <wsdl:input message="..."/>
         <wsdl:output message="..."/> <!--- that tag-->
     </wsdl:operation>
</wsdl:portType>
一直在等你来 2024-12-28 12:31:42

那是因为你没有 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');
}

That's because you don't have a try/catch block.

Try this:

$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');
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文