2014-11-19 15 views
11

Sto provando a consumare un servizio Web SOAP, ma il WSDL è un po 'guasto, quindi devo fare un po' di personalizzazione su node-soap.Come posso forzare l'uso del prefisso dello spazio dei nomi?

La Busta SOAP ideale che mi piacerebbe avere sarebbe questo uno:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> 
    <Body> 
     <getImagesDefinition xmlns="http://services.example.com/"/> 
    </Body> 
</Envelope> 

Finora questo è il codice nodejs devo richiamare il servizio:

var soap = require('soap'); 
var url = 'http://www.example.com/services/imagesizes?wsdl'; 

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

    client.setEndpoint('http://www.example.com/services/imagesizes'); 
    client.getImagesDefinition(null, function(err, result) { 
     console.log(result); 
    }); 
    console.log(client.lastRequest) 

}); 

ho dovuto imposta manualmente l'endpoint perché è rotto nel file WSDL

La busta che ottengo quando si stampa client.lastRequest è questa:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:tns="http://services.example.com/"> 
    <soap:Body> 
     <getImagesDefinition /> 
    </soap:Body> 
</soap:Envelope> 

so che se riesco a forzare il prefisso dello spazio dei nomi sul corpo di avere <tns:getImagesDefinition /> invece di <getImagesDefinition /> richiesta funziona perfettamente.

C'è un modo per costringerlo?

Ho letto la documentazione dicendo che tns è uno spazio dei nomi di default ignorato, così ho cercato di cambiare la situazione in questo modo:

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

e l'invio di tale oggetto al metodo soap.createClient, ma non vedo alcuna differenza sulla Busta.

C'è comunque un modo per forzare questo? o arrivare alla busta SOAP ideale?

Grazie!

risposta

2

Vedi this filo discutere lo stesso problema a github:

E soprattutto https://github.com/vpulim/node-soap/issues/537#issuecomment-72041420

+2

Correzione temporanea: modificare la riga 1047 in wsdl.js in: 'WSDL.prototype.ignoredNamespaces = ['targetNamespace', 'typedNamespace'];' –

+3

Il collegamento è interrotto. Puoi per favore elaborare? – analytik

+11

Ecco perché le risposte che contengono solo collegamenti non sono utili – Trev

3

mi sono imbattuto in questo problema esatto e per me, la correzione è stato quello di ignorare le ignoredNamespaces - per rimuovere 'TNS' come uno spazio dei nomi ignorato.

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

Io non sono sicuro perché non ha funzionato per voi, ma forse c'era un bug nella libreria che da allora è stata fissata. O forse perché non hai incluso alcun namespace, ma piuttosto un array vuoto.

Problemi correlati