ejemplo - Validar una solicitud SOAP entrante para el WSDL en PHP
soapclient laravel (5)
Por lo general, uno no se valida con el WSDL. Si el WSDL está diseñado correctamente, debe existir un esquema xml subyacente (XSD) para validar el cuerpo de la solicitud. Su analizador XML debería poder hacer esto.
El resto depende de cómo implemente el servicio web y qué motor SOAP está utilizando. No estoy familiarizado directamente con el motor PHP. Para WSDL / nivel de interfaz de "validación" generalmente hago algo como esto:
- ¿El cuerpo de la solicitud coincide con un tipo de solicitud conocido y es válido (por XSD)?
- ¿Tiene sentido el mensaje en este contexto y puedo asignarlo a una operación / manejador?
- Si es así, comience a procesarlo
- De lo contrario: error
La extensión PHP
incorporada para SOAP
no valida todo en la solicitud SOAP
entrante contra el XML Schema
en el WSDL
. Comprueba la existencia de entidades básicas, pero cuando tienes algo complicado como simpleType
restricciones de tipo, la extensión prácticamente ignora su existencia.
¿Cuál es la mejor manera de validar la solicitud SOAP
contra el XML Schema
contenido en el WSDL
?
Hace un tiempo, creé un servicio web de prueba de concepto con PHP usando NuSOAP . No sé si valida la entrada, pero supongo que sí.
Además de las librerías nativas PHP5 SOAP, también puedo decirte que ni la PEAR ni las libs Zend SOAP harán la validación de esquema de los mensajes actualmente. (No sé de ninguna implementación de PHP SOAP que, lamentablemente, lo haga)
Lo que haría es cargar el mensaje XML en un objeto DOMDocument y usar los métodos de DOMDocument para validar contra el esquema.
No pude encontrar ninguna forma simple de realizar la validación y al final tuve un código de validación en la lógica comercial.
He estado cavando sobre este asunto a horas de vista. Ni el PHP SoapServer nativo ni la Biblioteca NuSOAP realizan ninguna Validación. PHP SoapServer simplemente hace un molde de tipo. Por ejemplo si defines
<xsd:element name="SomeParameter" type="xsd:boolean" />
y enviar
<get:SomeParameter>dfgdfg</get:SomeParameter>
Obtendrás el tipo php booleano (verdadero)
NuSOAP simplemente emite todo a la cadena aunque reconoce tipos simples:
desde el registro de depuración nuSOAP:
nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean
Entonces, la mejor manera es la solución de joelhardi para validar usted mismo o usar algún analizador xml como XERCES