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?

Foi útil?

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:

  1. O corpo da solicitação corresponder a um pedido conhecido e é válido (por XSD)?
  2. Será que o sentido mensagem make neste contexto e i pode mapeá-lo para uma operação / manipulador?
  3. Se assim for, começar a processá-lo
  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top