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 ?

È stato utile?

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:

  1. Il corpo della richiesta corrisponde a un tipo di richiesta noto ed è valido (da XSD)?
  2. Il messaggio ha senso in questo contesto e posso mapparlo su un'operazione / gestore?
  3. In tal caso, inizia a elaborarlo
  4. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top