使用PHP实现SOAP与SAP Web Service的交互

3

我在企业环境中想要做的是使用PHP类SoapClient以wsdl模式连接SAP Web服务。

到目前为止,我所完成的工作是收到“缺少属性”错误。当我解决了所有缺少属性错误后,我遇到了可怕的http错误500,其主体为:soap-env:Server

这是我的代码:

class SapTest {
 const SAP_WSDL_URI  = *wsdl_uri*;
 const SAP_USER = *username*;
 const SAP_PWD  = *password*;

public function execute() {

        $client = new SoapClient('http://'.urlencode(self::SAP_USER).':'.urldecode(self::SAP_PWD).'@'.self::SAP_WSDL_URI,
                array("trace" => 1,
                      "exceptions" => 1,
                      "login" => self::SAP_USER,
                      "password" => self::SAP_PWD,
                      'features' => SOAP_SINGLE_ELEMENT_ARRAYS)
        );

        $method = '_-bic_-nf2';

        $parameter = array('ETColumnDescription' => null,
                           'ETGridData' => null,
                           'ETMessageLog' => null,
                           'ETRowDescription' => null,
                           'ISVar_01xwerbet' => array('Sign' => 'I',
                                                      'Option' => 'LE',
                                                      'Low' => '3',
                                                      'High' => null));

        try
        {

        $result = $client->$method($parameter);
        print_r($result);
        } catch(SoapFault $e) {

        echo "REQUEST HEADER:\n" . $client->__getLastRequestHeaders() . "\n";
          echo "REQUEST:\n" . $client->__getLastRequest() . "\n";

          echo "RESPONSE HEADER:\n" . $client->__getLastResponseHeaders() . "\n";

          echo "RESPONSE:\n" . $client->__getLastResponse() . "\n";
        print_r($e);
    }


}

}

$oSap = new SapTest();
$oSap->execute();

我的XML输出如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:sap-com:document:sap:soap:functions:mc-style">
 <SOAP-ENV:Body>
  <ns1:_-bic_-nf2>
   <ETColumnDescription/>
   <ETGridData/>
   <ETMessageLog/>
   <ETRowDescription/>
   <ISVar_01xwerbet>
    <Sign>I</Sign>
    <Option>LE</Option>
    <Low>3</Low>
    <High/>
   </ISVar_01xwerbet>
  </ns1:_-bic_-nf2>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

预期的 XML 应该如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
 <soapenv:Body>
  <urn:_-bic_-nf2>
   <ETColumnDescription/>
   <ETGridData/>
   <ETMessageLog/>
   <ETRowDescription/>
   <ISVar_01xwerbet>
    <Sign>I</Sign>
    <Option>LE</Option>
    <Low>3</Low>
    <High/>
   </ISVar_01xwerbet>
  </urn:_-bic_-nf2>
 </soapenv:Body>
</soapenv:Envelope>

我不确定是否缺少空白的头标签,我似乎无法使用基本的PHP添加它(我可以添加一个标题,但添加一个空白的标题似乎是困难的)。或者是不同的前缀(ns1 / urn或soapenv / SOAP-ENV),但我已经开始为此疯狂了。非常感谢您的帮助。

提前致谢!

1个回答

0

你的SOAP请求没问题。 ns1/urnsoapenv/SOAP-ENV 只是表示命名空间的前缀。不同的Web服务引擎以不同的方式生成它们的命名空间前缀,而Web服务必须能够接受它们。

SOAP头对于一个Web服务来说并不是强制性的,但如果你的服务需要它,你应该提供它。

我建议你与服务提供商讨论一下请求出了什么问题,如果不可能的话,可以使用一个SOAP测试工具,比如SOAPui

要创建一个空的SOAP头,请尝试:

$header =new SoapHeader('urn:sap-com:document:sap:soap:functions:mc-style', null);
$client->__setSoapHeaders($header);

感谢您的回答,有没有一种方法可以创建一个空的SOAP头部? - undefined
我遇到了一个致命错误 :-( 虽然谢谢你,但还想尝试其他方法。 - undefined
有没有解决上述问题的办法?我也遇到了同样的问题。我需要在wsdl中使用wsp策略标签来调用SAP Pi Webservice。非常感谢任何帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接