Convalida una richiesta SOAP in arrivo sul WSDL in PHP
Domanda
L'estensione PHP
integrata per SOAP
non convalida tutto nella richiesta SOAP
in entrata rispetto allo schema XML
nel WSDL
. Verifica l'esistenza di entità di base, ma quando hai qualcosa di complicato come le restrizioni simpleType
l'estensione praticamente ignora la loro esistenza.
Qual è il modo migliore per convalidare la richiesta SOAP
rispetto a XML Schema
contenuto nel WSDL
?
Soluzione
Ho approfondito questo argomento per ore. Né il SoapServer PHP nativo né la libreria NuSOAP eseguono alcuna convalida. PHP SoapServer crea semplicemente un cast di tipo. Ad esempio, se si definisce
<xsd:element name="SomeParameter" type="xsd:boolean" />
e invia
<get:SomeParameter>dfgdfg</get:SomeParameter>
otterrai il tipo php booleano (vero)
NuSOAP lancia semplicemente tutto su stringa anche se riconosce tipi semplici:
dal registro di debug nuSOAP:
nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean
Quindi il modo migliore è la soluzione joelhardi per convalidare te stesso o usare un parser xml come XERCES
Altri suggerimenti
Oltre alle librerie SOAP PHP5 native, posso anche dirvi che né le librerie SOAR PEAR né Zend eseguiranno attualmente la convalida dello schema dei messaggi. (Sfortunatamente non conosco alcuna implementazione di PHP SOAP.)
Quello che vorrei fare è caricare il messaggio XML in un DOMDocument obiettare e utilizzare i metodi di DOMDocument per convalidare rispetto allo schema.
Di solito non si convalida con il WSDL. Se WSDL è progettato correttamente, dovrebbe essere presente uno schema xml sottostante (XSD) per convalidare il corpo della richiesta. Il tuo parser XML dovrebbe essere in grado di farlo.
Il resto dipende dalla modalità di implementazione del servizio Web e dal motore SOAP in uso. Non ho familiarità con il motore PHP. Per WSDL / livello di interfaccia "validazione" Di solito faccio qualcosa del genere:
- Il corpo della richiesta corrisponde a un tipo di richiesta noto ed è valido (da XSD)?
- Il messaggio ha senso in questo contesto e posso mapparlo su un'operazione / gestore?
- In tal caso, inizia a elaborarlo
- Altrimenti: errore
Non sono stato in grado di trovare alcun modo semplice per eseguire la convalida e alla fine avevo il codice di convalida nella logica aziendale.
Qualche tempo fa ho creato una dimostrazione di concetto servizio web con PHP utilizzando NuSOAP . Non so se convalida l'input, ma suppongo che lo sia.