Niteliği ile SOAP isteği

3 Cevap php

Ben XSD_ANYXML kodlaması kullanmadan bir soap isteği için bir öznitelik nasıl bulmak gibi olamaz.

Aşağıdaki gibi istek parametresi görünmelidir

<request
    xmlns:ns="/some/ns">
    ...
        <ns:parameter attr="some attribute">
            value
        </ns:parameter>
    ...
</request>

Tabii ki aşağıdaki kod çalışır, ancak (bu genel ad kullanmak değildir, çünkü o gereken use the SOAP_Client API dize birleştirme kullanır, çünkü, çirkin ve) oldukça çirkin

$param = new SoapVar(
    '<ns_xxx:parameter xmlns:ns_xxx="/some/ns" attr="some attribute">
        value
     </ns_xxx:parameter>',
    XSD_ANYXML
);

Bir ad ve bir özelliği ile bir soap isteği parametre oluşturmak için daha iyi bir yolu var mı?

Ben bşin arıyorum gibi (bu SoapVar API kullanarak sadece bazı sözde kod) aşağıdaki gibidir:

$param = new SoapVar(
    array(
        '_' => 'value',
        'attr' => 'some attribute'
    ), 
    SOME_ENCODING,
    null,
    null,
    null,
    '/some/ns'
);

3 Cevap

Bunun için, SoapClient dan türetilmiş sınıf ve yöntem __ doRequest () geçersiz kılmak gerekir:

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();

Ben bu sorunu çözeceğini umuyoruz.

SABUN öznitelikleri desteklemiyor, bunun yerine DİNLENME kullanmalısınız olabilir!

EDIT: Please check the body style w3c:"4.3 SOAP Body" and remember that you need to encode your message with "soap-envelope" namespace and describe your XML types thats why, you can't use attributes to describe your message data.

But if you ask me, it can be made possible! You can use a custom SoapClient parser or something like that and convert your message as you like it. A example of that may be RSS over SOAP http://www.ibm.com/developerworks/webservices/library/ws-soaprdf. But, the problem would be that you would miss the descriptive information about your message data/types and other clients could not easy understand your messages!

My best practice for you would be to use elements instead of attributes, i know you need to fix your XML schema but thats the way it goes or switch to a other technology.

SABUN 1 destek niteliklerini yok. Burada (bir istemci) özelliklerini ve değerlerini ikisini de kullanarak Perl kodu bir örnek:

$som = $client->call(
    'tran:getContent',
    SOAP::Header->name('cred:credentials')->attr({
        'username' => $username,
        'password' => 'xxx',
        'customerID' => 'xxx'}
    ),
    SOAP::Data->name('contentID')->value('9999')
)