SAP Web 服务 PHP SoapClient 输入参数

SAP Web Service PHP SoapClient input parameters

我需要使用 PHP SoapClient 消费或调用 SAP Web Service。我在为被调用的函数构建 SOAP XML 输入参数时遇到问题,这是预期结构的示例:

    <xmii:XacuteRequest>
         <xmii:InputPar>
        <xmii:DATAINPUT>
                <![CDATA[<DATA><item><OBJECTID>1001</OBJECTID><OBJECTITEM/><FIELDNAME/><FIELDVALUE/></item></DATA>]]>
        </xmii:DATAINPUT>
            <xmii:TRANS>GETNAME</xmii:TRANS>
         </xmii:InputPar>
      </xmii:XacuteRequest>

我需要赋值的参数是OBJECTIDTRANS。我遇到了 OBJECTID

的问题

如果我这样做 $soapclient->__getTypes(); 我明白了:

    struct InputPar {
        string DATAINPUT;
        string TRANS;
    }

    struct XacuteRequest {
        InputParams InputPar;
    }

这是我当前数组的样子:

$params = array('InputPar' => array( array('DATAINPUT' => array('DATA' => array( 'item' => array('OBJECTID' => '1001') ) )),
             'TRANS' => 'GETNAME'
)

当我执行此操作时,我确实收到了 "Customer not found" 的响应,没有任何错误。这告诉我一切正常,但 OBJECTID 没有被提取。此外,如果我将 TRANS 更改为 'xxx',我不会收到 "Customer not found" 响应,告诉我 TRANS 已被正确拾取。

所以我唯一的问题是如何构造 may 数组以便 OBJECTID 被识别?

我明白了,这里是为遇到相同问题的人提供的解决方案。

所以尽管 DATAINPUT 显然是一个数组,但要注意的是:

<![CDATA[]]

CDATA 表示字符数据,CDATA 被定义为文本块。这是为了在字符串中允许 XML 个字符。

所以每当你看到你的标签在 CDATA 中时,在 PHP SoapClient 中你必须以特定的方式声明,通常 XML 标签将被转义,我需要字符串是完全一样。

我必须创建一个新的 SoapVar,它是 SoapClient class 的一部分,包含字符串和重要的 XSD_ANYXML 参数。我是这样做的:

$xmlContent = "<DATA><item><OBJECTID>1001</OBJECTID><OBJECTITEM/><FIELDNAME/><FIELDVALUE/></item></DATA>";

$tag = new SoapVar("<DATAINPUT><![CDATA[{$xmlContent}]]></DATAINPUT>", XSD_ANYXML);

$params = array('InputParams' => array(
        'DATAINPUT' => $tag,
        'TRANS' => 'GETNAME'
    )
);

您可能会注意到它位于 $tag 变量中,并且再次位于 $params 数组中。我不确定为什么,但如果我从 $tag 变量中删除它,它就不起作用了。

$soapclient->__getLastRequest() 是一个非常有助于查看发送内容结构的 SoapClient 函数。在发送 xml.

后调用此方法
echo '<pre>';
echo "REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $soapclient->__getLastRequest())) . "\n";
echo '</pre>';

如果你想使用 __getLastRequest(),请确保在像这样创建 soapclient 时将 "trace" 设置为 1:

$option=array('trace'=>1);
$soapclient = new SoapClient($url, $option);