Tuesday, June 28, 2016

Design for the default

If the library doesn't work out of the box, there must be a problem with the library.

node-soap generates xmlns prefix (tns), but it doesn't apply it to SOAP's method:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:tns="http://v5.soap.platform.helloworld.com/">
    <soap:Body>
         <authenticate>
             <apiKey>meh</apiKey>
             <username>ryan</username>
             <password>dahl</password>
        </authenticate>
    </soap:Body>
</soap:Envelope>

This is the right XML, as tested in Google Chrome's Boomerang extension, there is tns prefix in SOAP's method (authenticate):
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:tns="http://v5.soap.platform.helloworld.com/">
    <soap:Body>
         <tns:authenticate>
             <apiKey>meh</apiKey>
             <username>ryan</username>
             <password>dahl</password>
        </tns:authenticate>
    </soap:Body>
</soap:Envelope>



To fix the node-soap's broken default, add this option on createClient method:

var options = {
    ignoredNamespaces: {
        namespaces: [],
        override: true
    }
}


soap.createClient ( url, options, function ( err, client ) {


Using that, node-soap will apply the tns prefix to the SOAP's method name.


.NET's generated SOAP works out of the box, notice that there is no prefix in SOAP call:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" />
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <authenticate xmlns="http://v5.soap.platform.helloworld.com/">
            <apiKey xmlns="">meh</apiKey>
            <username xmlns="">ryan</username>
            <password xmlns="">dahl</password>
        </authenticate>
    </s:Body>
</s:Envelope>


Happy Coding!

No comments:

Post a Comment