PHP SoapClient: impostare uno spazio dei nomi senza prefisso

voti
0

Sto consumando un servizio WSDL SOAP utilizzando SoapClient di PHP. L'XML generato contiene le seguenti definizioni dello spazio dei nomi:

<SOAP-ENV:Envelope
    xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/
    xmlns:ns1=WebApplicationImport
    ....>

E gli elementi di questo ns1spazio dei nomi sono tutti prefisso ns1:elementName.

Il fornitore di servizi dice che questo è sbagliato e che vogliono questi elementi senza il prefisso, anche se il WSDL definisce un requisito per esso: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Una soluzione è quella di effettuare le seguenti operazioni prima di inviare il codice XML: $xml = str_replace(':ns1', '', $xml);. Questo funziona, ma è chiaramente un hack, e io non sono un fan di hack.

C'è un modo per dire SoapClienta gestire uno spazio dei nomi specifico come default / non premettere ad essa? Cosa desidero raggiungere è <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>prima di generare il resto dell'involucro, che, in teoria, garantire che tutti gli elementi di tale dominio sono anche unprefixed. Questa sembrerebbe la soluzione adeguata e valida per me.

È pubblicato 24/10/2019 alle 11:57
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

WebApplicationImportnon è una valida URI . Quindi non è un namespace valido. Così il WSDL e XML è in realtà valido. alcuni parser potrebbe tollerare spazi dei nomi del genere ma dovrebbe essere qualcosa di simile urn:WebApplicationImporto http://example.com/ns/WebApplicationImport.

Rimuovendo il prefisso si mette gli elementi nel namespace predefinito corrente e questo dovrebbe essere il non namespace vuoto / in te caso.

Abbastanza interessante PHP DOM tollera nelle definizioni spazio dei nomi per i prefissi, ma non per lo spazio dei nomi di default:

$document = new DOMDocument();
$document->loadXML(
    '<foo xmlns="WebApplicationImport"/>'
);

Produzione:

Notice: DOMDocument::loadXML(): xmlns: URI WebApplicationImport is not absolute in Entity

Quindi, a seconda del parser il fornitore del servizio utilizza potrebbe gettare gli errori per WebApplicationImportcome uno spazio dei nomi URI.

È necessario rimuovere / fissare il namespace nel WSDL. Se si fissa poi il fornitore di servizi deve adattare la sua logica di utilizzare il nuovo spazio dei nomi.

I prefissi sono solo alias per reale dello spazio dei nomi URI. I seguenti 3 esempi possono essere lette come {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Risposto il 25/10/2019 a 14:30
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more