工做中須要用php調用web service接口,php4裏用nusoap這個模塊調用的方法,其實php5裏已經包含了處理soap的模塊,下面用一個例子用說明:php
extension=php_openssl.dllhtml
extension=php_soap.dlljava
php.ini 這2項要開通web
web service服務是一個用java寫的簡單服務,環境爲Tomcat6.0 + Axis2,暴露的方法爲 String sayHello(String name)數組
傳遞一個String參數name,而後返回給客戶端。編碼
使用php5開發客戶端: <?php header("content-type:text/html;charset=utf-8"); try { //$client = new SoapClient("HelloService.wsdl",array('encoding'=>'UTF-8')); $client = new SoapClient("http://localhost:8080/axis2/services/HelloService?wsdl",array('encoding'=>'UTF-8')); var_dump($client->__getFunctions());//打印暴露的方法 print("<br/>"); var_dump($client->__getTypes());//打印對應方法的參數和參數類型 print("<br/>"); $parm = "hello my name is liguoxiang"; $param = array('agr0' => $parm); $arr = $client->sayHello($param); print_r($arr); } catch (SOAPFault $e) { print $e; } ?>
代碼確實很簡單吧,建立SoapClient對象時,能夠使用保存在本地WSDL文件,也能夠使用遠程的地址,後面的array數組裏能夠帶上不少的參數,具體參數能夠查php的SoapClient幫助,這裏帶的是字符集編碼,若是調用方法的參數裏有中文,必定要指定字符集編碼,不然會出錯。spa
調用web service前能夠先調用SoapClient的__geunctions()和__getTypes()方法看一下你要調用的web service暴露的方法,參數和數據類型,須要注意的是傳入的參數名必定要和soapclient裏面定義的一致,不然參數是傳不過去的. (本例子中__geunctions()和__getTypes()方法打印的結果以下圖)code
從上圖能夠看出,雖然在java中sayHello(String name)中參數名爲name,可是這裏打印出來顯示參數名稱爲「agr0".因此,在上面代碼中使用$param = array('agr0' => $parm);arg0來做爲鍵。orm
運行結果以下:xml
不知道WSDL的狀況也能夠調用WS,須要使用SoapClient的__soapCall()或__call()方法,具體使用方法能夠查php的幫助文檔。
另外發現個問題,若是web service方法返回的是xml格式的字符串,php接收到之後會本身把數據內容解析出來,而不是xml字符串.