我向SAP PI Web服务发出SOAP请求。此服务返回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(soap fault),我就抓住了。
答案 0 :(得分:0)
那是因为你没有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');
}
答案 1 :(得分:0)
问题出在WSDL中的 output 标记中。我添加了这个标签,它解决了我的问题
<wsdl:portType name="...">
<wsdl:operation name="...">
...
<wsdl:input message="..."/>
<wsdl:output message="..."/> <!--- that tag-->
</wsdl:operation>
</wsdl:portType>