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>
我需要赋值的参数是OBJECTID
和TRANS
。我遇到了 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);
我需要使用 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>
我需要赋值的参数是OBJECTID
和TRANS
。我遇到了 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);