Встроенное расширение PHP для SOAP не проверяет все во входящем запросе SOAP на соответствие XML Schema в WSDL. Он действительно проверяет наличие базовых сущностей, но когда у вас есть что-то сложное, например ограничения simpleType, расширение практически игнорирует их существование.
Как лучше всего проверить запрос SOAP на соответствие XML Schema, содержащемуся в WSDL?






Обычно проверка на соответствие WSDL не проводится. Если WSDL спроектирован правильно, должна существовать базовая xml-схема (XSD) для проверки тела запроса. Ваш XML-парсер должен уметь это делать.
Остальное зависит от того, как вы реализуете веб-службу и какой механизм SOAP вы используете. Я не знаком напрямую с движком PHP. Для «проверки» уровня WSDL / интерфейса я обычно делаю что-то вроде этого:
Некоторое время назад я создал веб-сервис доказательство концепции с PHP, используя NuSOAP. Я не знаю, проверяет ли он ввод, но я предполагаю, что это так.
Помимо собственных библиотек SOAP PHP5, я также могу сказать вам, что ни PEAR, ни Zend SOAP libs в настоящее время не выполняют проверку схемы сообщений. (К сожалению, я не знаю ни одной такой реализации PHP SOAP.)
Я бы загрузил XML-сообщение в объект DOMDocument и использовал методы DOMDocument для проверки соответствия схеме.
Мне не удалось найти простой способ выполнить проверку, и в конце концов у меня был код проверки в бизнес-логике.
Покопался на этом обзоре часов. Ни собственный PHP SoapServer, ни библиотека NuSOAP не выполняют никакой проверки. PHP SoapServer просто выполняет приведение типа. Например, если вы определяете
<xsd:element name = "SomeParameter" type = "xsd:boolean" />
и представить
<get:SomeParameter>dfgdfg</get:SomeParameter>
вы получите логическое значение php Type (true)
NuSOAP просто преобразует все в строку, хотя распознает простые типы:
из журнала отладки nuSOAP:
nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean
Итак, лучший способ - это решение joelhardi, чтобы проверить себя или использовать какой-либо xml Parser, например XERCES.