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