2012年4月6日 星期五

PHP SOAP (WSDL)

最近在接觸WSDL時,碰到了一些NameSpace設定上的問題,在此memo設定方式。

WSDL file的一段

< element name='funcA' >
  < complexType >
    < sequence >
      < element name='param1' type='abc:elementA' >
      < element name='param2' type='abc:elementB' >
    < /sequence >
  < /complexType >
< /element >

< complexType name=' elementA' >
  < sequence >
    < element name='AA' type='xsd:string'>
  < /sequence > 
< /complexType >

< complexType name=' elementB' >
  < sequence >
    < element name='abc:elementBB' type='abc:BB' >
  < /sequence > 
< /complexType >

< complexType name=' elementBB' >
  < sequence >
    < element name='BBB' type='xsd:int' >
  < /sequence > 
< /complexType >

如上為一段WSDL中一段function call內容的定義,funcA有一個Complex Type的 input 參數,包著一個 sequence,裡面有兩個elements。此兩個 elements皆為自定義 variable。必須指定其所給的NameSpace (abc)。

所以就會成為以下設定
$params = array('param1'=>new SoapVar(array("AA"=>'test'), SOAP_ENC_OBJECT, null, null, 'elementA', 'abc'), 'param2'=>new SoapVar(array( "elementBB"=>new SoapVar(array("BBB"=>'test'), SOAP_ENC_OBJECT, null, null, 'elementBB', 'abc') ), SOAP_ENC_OBJECT, null, null, 'elementA', 'abc'));

首先,先分開來看,先看怎麼定義第一個element 'param1'
new SoapVar(array("AA"=>'test'), SOAP_ENC_OBJECT, null, null, 'elementA', 'abc')

再來是第二個element 'param2'
new SoapVar(array( "elementBB"=>new SoapVar(array("BBB"=>'test'), SOAP_ENC_OBJECT, null, null, 'elementBB', 'abc') ), SOAP_ENC_OBJECT, null, null, 'elementA', 'abc')

上面黃色部分是BB底下又包了一層complex type 'elementBBB',先不看這部分的話 其實是跟 'param1'是一樣的

最後把上面兩個elements用Array合起來,並給予name index,即完成!

如果有name沒設,或NameSpace沒設,有些server會認不出來而產生error。


搜尋此網誌