带有属性的SOAP请求

时间:2009-08-25 09:37:32

标签: php soap soap-client

我似乎无法在不使用 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'
);

3 个答案:

答案 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')
)