Perché il servizio web restituisce i dati anche se l'indirizzo IP in wsdl è errato?

C'è un file PHP che funge da webservice , e c'è il file wsdl in cui ci sono queste righe:

 <service name="ClientService"> <documentation></documentation> <!-- partie 8 : Port --> <port name="ClientPort" binding="typens:ClientBinding"> <soap:address location="http://192.168.1.12/imfmobile/webservice/InterfaceTransfererClient.php"/> </port> </service> 

Il problema è che l'indirizzo IP del computer in cui risiedono webservice e wsdl è 192.168.1.123 e ottengo dati quando chiami una function dal servizio web PHP ! Quindi il <soap:address tag <soap:address non è necessario?

Risposta breve: l'indirizzo è solo un'indicazione (per gli sviluppatori o gli strumenti che generano codice e configuration) di where il servizio potrebbe essere accessibile e che tipo di URL attendersi.

Risposta lunga: se si guarda lo schema WSDL , si vedrà che l'elemento port è definito come contenente solo un name e binding attributo di binding , quindi sarà sufficiente. Il tuo elemento di servizio potrebbe sembrare così e sarà tecnicamente corretto:

 <service name="ClientService"> <port name="ClientPort" binding="typens:ClientBinding" /> </service> 

Ma la port è anche definita come un elemento estensibile che consente di aggiungere elementi da altri spazi dei nomi (come <soap:address> ).

Normalmente (sì!) Il <soap:address> dovrebbe indicare where è esposto il vero servizio, ma sfortunatamente non succede sempre così a causa di diversi fattori come:

  • alcuni indirizzi del server sono stati modificati e la gente si è dimenticata di aggiornare il file WSDL (per i primi WSDL creati a contratto);
  • il WSDL viene generato automaticamente da un framework ( ultimo contratto ) e il framework non ha modo di sapere a quale indirizzo esterno viene esposto il servizio web, quindi aggiunge alcuni indirizzi predefiniti con qualcosa che conosce (come l'IP locale o il nome del computer);
  • si dispone di un WSDL centrale che descrive 3 servizi distribuiti identici (uno in DEV, uno in UAT e uno in PROD) e non è ansible aggiungere un indirizzo per tutti e 3 di essi;
  • ecc ecc

I WSDL sono principalmente utilizzati per generare codice client. Una volta fatto ciò non hai più bisogno del WSDL, hai solo bisogno di un URL where connetterti al servizio web distribuito. L'indirizzo è lì come suggerimento per gli strumenti per aggiungere alcune configurazioni di default, che in seguito sostituirai con l'indirizzo REAL per le chiamate.

Idealmente, ciò che è nel WSDL dovrebbe essere uguale all'indirizzo reale, ma sono alcune informazioni che di solito ricadono durante le attività di manutenzione e le cose finiscono per diventare obsolete. Dovresti specificarne uno come suggerimento, anche se è solo <soap:address location="http://localhost/imfmobile/webservice/InterfaceTransfererClient.php"/> .