我似乎无法在不使用 XSD_ANYXML 编码的情况下找到如何将属性设置为SOAP请求。
请求参数应如下所示
<request
xmlns:ns="/some/ns">
...
<ns:parameter attr="some attribute">
value
</ns:parameter>
...
</request>
当然下面的代码可以工作,但它相当难看(丑陋,因为它使用字符串连接,它应该使用SOAP_Client API ,因为它不使用通用命名空间)
$param = new SoapVar(
'<ns_xxx:parameter xmlns:ns_xxx="/some/ns" attr="some attribute">
value
</ns_xxx:parameter>',
XSD_ANYXML
);
是否有更好的方法来创建具有命名空间和属性的SOAP请求参数?
我正在寻找s.th.如下所示(这只是使用SoapVar API的一些伪代码):
$param = new SoapVar(
array(
'_' => 'value',
'attr' => 'some attribute'
),
SOME_ENCODING,
null,
null,
null,
'/some/ns'
);
答案 0 :(得分:3)
为此,您需要从SoapClient派生类并覆盖方法__doRequest():
class ABRSoapClient extends SoapClient {
// return xml request
function __doRequest($request, $location, $action, $version) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$xml= $dom->loadXML($request);
// Goto request Node and Set the attribute
$attr_ns = $dom->createAttributeNS('xmlns:ns', '' ); // instead of xmlns:ns use Namespace URL
$attr_ns->value = '/some/ns';
// add atribute in businessReport node
$dom->getElementsByTagName($report_type)->item(0)->appendChild( $attr_ns );
$request = $dom->saveXML();
return parent::__doRequest($request, $location, $action, $version);
}
}
$client = new ABRSoapClient(.....);
$save_result = $client->request($param);
// You can check the form request using function
$client->__getLastRequest();
我希望这能解决你的问题。
答案 1 :(得分:0)
SOAP不支持属性,可能应该使用REST代替!
修改强> 请检查身体样式w3c:“4.3 SOAP Body”并记住这一点 您需要使用“soap-envelope”命名空间对消息进行编码并进行描述 您的XML类型就是为什么,您不能使用属性来描述您的消息数据。
但如果你问我,它可以成为可能!您可以使用自定义SoapClient解析器或类似的东西,并根据需要转换您的消息。 其中一个例子可能是RSS over SOAP http://www.ibm.com/developerworks/webservices/library/ws-soaprdf。 但是,问题是您会错过有关您的邮件数据/类型的描述性信息,而其他客户端无法轻易理解您的邮件!
我的最佳做法是使用元素而不是属性, 我知道你需要修复你的XML模式,但这就是它的方式或转换到其他技术。
答案 2 :(得分:-3)
SOAP 1支持属性。以下是使用属性和值(来自客户端)的Perl代码示例:
$som = $client->call(
'tran:getContent',
SOAP::Header->name('cred:credentials')->attr({
'username' => $username,
'password' => 'xxx',
'customerID' => 'xxx'}
),
SOAP::Data->name('contentID')->value('9999')
)