2008-09-19 78 views
8

SOAP的內置PHP擴展不會驗證傳入的SOAP請求中的所有內容,而不是驗證WSDL中的XML Schema。它確實檢查是否存在基本實體,但是當你遇到像simpleType限制那樣複雜的事情時,擴展名會忽略它們的存在。在PHP中驗證到WSDL的傳入SOAP請求

驗證SOAP請求的最佳方法是什麼?WSDL中包含XML Schema

回答

2

在這個問題上一直在挖掘幾個小時。 原生的PHP SoapServer不需要NuSOAP庫就可以進行任何驗證。 PHP SoapServer只是進行類型轉換。 因爲如果你定義

<xsd:element name="SomeParameter" type="xsd:boolean" /> 

,並提交實例

<get:SomeParameter>dfgdfg</get:SomeParameter> 

你會得到PHP類型布爾(真)

的NuSOAP只是蒙上寄託都串,儘管它承認簡單類型:

來自nuSOAP調試日誌的

nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean 

所以最好的方法是joelhardi解決方案來驗證自己或使用一些XML解析器像XERCES

1

通常,不會針對WSDL進行驗證。如果WSDL設計正確,那麼應該有一個基礎xml模式(XSD)來驗證請求的主體。你的XML解析器應該能夠做到這一點。

剩下的事情取決於您如何實現Web服務以及您正在使用的SOAP引擎。我不直接熟悉PHP引擎。對於WSDL /接口級別的「驗證」,我通常會這樣做:

  1. 請求的主體是否匹配已知的請求類型並且它是否有效(通過XSD)?
  2. 該信息在這種情況下是否有意義,我可以將它映射到操作/處理程序?
  3. 如果是這樣,開始處理它
  4. 否則:錯誤
+0

我編輯了問題澄清。 – 2008-09-22 15:43:12

-3

前段時間我已經創建使用NuSOAP PHP a proof of concept Web服務。我不知道它是否驗證輸入,但我會假設它。

4

除了原生的PHP5 SOAP庫之外,我還可以告訴你,PEAR和Zend SOAP庫都不會對目前的消息進行模式驗證。 (不幸的是,我不知道有任何PHP SOAP實現)

我會做的是將XML消息加載到DOMDocument對象中,並使用DOMDocument的方法對模式進行驗證。

-1

我無法找到任何簡單的方法來執行驗證,並最終在業務邏輯中有驗證碼。