Validar um pedido SOAP de entrada para o WSDL em PHP
Pergunta
A built-in de extensão PHP
para SOAP
não valida tudo na solicitação SOAP
recebida contra o XML Schema
na WSDL
. Ele faz seleção para a existência de entidades básicas, mas quando você tem algo complicado como restrições simpleType
a extensão praticamente ignora sua existência.
O que é a melhor maneira de validar o pedido SOAP
contra XML Schema
contida no WSDL
?
Solução
Foi cavando ao redor sobre este assunto uma vista horas. Nem o nativo PHP SoapServer nore a Biblioteca NuSOAP faz qualquer validação. PHP SoapServer simplesmente faz um tipo elenco. Por exemplo, se você definir
<xsd:element name="SomeParameter" type="xsd:boolean" />
e enviar
<get:SomeParameter>dfgdfg</get:SomeParameter>
você vai ter o tipo PHP booleano (true)
NuSOAP simplesmente moldes Everthing para string embora reconheça tipos simples:
do registro de NuSOAP depuração:
nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean
Portanto, a melhor maneira é solução joelhardi para validar a si mesmo ou usar algum xml Analisador como XERCES
Outras dicas
Além das libs PHP5 de SOAP nativos, posso também dizer-lhe que nem o PERA nem libs SABÃO Zend vai fazer a validação do esquema de mensagens no presente. (Eu não sei de qualquer implementação de SOAP PHP que faz, infelizmente.)
O que eu gostaria de fazer é carregar a mensagem XML em um DOMDocument objeto e usar métodos de DOMDocument para validar contra o esquema.
Normalmente um não valida contra o WSDL. Se o WSDL é projetado corretamente deve haver um esquema XML subjacente (XSD) para validar o corpo do pedido contra. O seu parser XML deve ser capaz de fazer isso.
O resto é com a forma como você implementar o serviço web e qual mecanismo de sabão que você está usando. Eu não sou diretamente familiarizado com o motor de PHP. Para WSDL / nível de interface de "validação" Eu costumo fazer algo parecido com isto:
- O corpo da solicitação corresponder a um pedido conhecido e é válido (por XSD)?
- Será que o sentido mensagem make neste contexto e i pode mapeá-lo para uma operação / manipulador?
- Se assim for, começar a processá-lo
- Caso contrário: Erro
Eu não era capaz de encontrar qualquer maneira simples de realizar a validação e no final teve código de validação na lógica de negócios.
Algum tempo atrás eu tenho criar uma prova de conceito serviço web com PHP usando NuSOAP . Eu não sei se ele valida a entrada, mas eu diria que ele faz.