PHP的soap使用
最近的工作專案中,接觸到了很多的政府 微信開發專案。對方的外包公司都是使用JAVA作為開發語言,然後通過WEBSERVICE進行介面返回資料到我的專案中。一般情況下,能在瀏覽器開啟並顯示資料的介面是直接可以使用 CURL或者file_get_contents進行接收的。但是WEBSERVICE是使用Soapservice。而我們知道,從php 5之後,php自身已經提供了通過 SoapClient 呼叫webservice的方法。使用方法很簡單:
$client = SoapClient('$wsdl'); //也可以使用SoapClient('$wsdl', 'UTF-8')設定特定的編碼。 $client->__soapCall($functionName, $params);
呼叫時可能出現的問題:
1:提示”Class ‘SoapClient’ not found”。
說明沒有安裝php-SOAP服務。在linux下使用
yum search soap | grep php
如果是Ubuntu系統,可以使用apt-get命令查詢soap並安裝。
安裝完成後,重啟apache服務即可。
2:無法傳遞引數,webservice收到的引數均為null。
原因是webservice限制了提交的引數必須為鍵值對形式,傳遞引數時要用
$params = array( array('key'=>'value' , 'key2'=>'value2', 'key3'=>'value3') )
的方式。或者將引數宣告為一個class,之後使用
$params = array( new class )
進行傳遞。
這時候你肯定會困惑,這個'key'值用什麼名稱,這時候,你可以呼叫下面的指令碼,檢視下,所有介面函式的引數需要使用什麼key值。
<?php // to see formated types $soap = new SoapClient('http://domain.com/ws.php?WSDL'); echo '<pre>'; echo '<h2>Types:</h2>'; $types = $soap->__getTypes(); foreach ($types as $type) { $type = preg_replace( array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'), array('<font color="green">${1}</font> <font color="blue">${2}</font>', "\n\t"), $type ); echo $type; echo "\n\n"; } echo '</pre>';
此部分參考http://www.php.net/manual/zh/soapclient.soapcall.php的說明。
3:總結:php有兩個擴充套件可以實現web service,一個是NuSoap,一個是php 官方的soap擴充套件,由於soap是官方的,所以我們這裡以soap來實現web service.由於預設是沒有開啟soap擴充套件的,所以自己先看一下soap擴充套件有沒有開啟。在soap編寫web service的過程中主要用到了SoapClient,SoapServer,SoapFault三個類。
SoapClient類
這個類用來使用Web services。SoapClient類可以作為給定Web services的客戶端。它有兩種操作形式:
- WSDL 模式
- Non-WSDL 模式
在WSDL模式中,構造器可以使用WSDL檔名作為引數,並從WSDL中提取服務所使用的資訊。
non-WSDL模式中使用引數來傳遞要使用的資訊。
SoapServer類
這個類可以用來提供Web services。與SoapClient類似,SoapServer也有兩種操作模式:WSDL模式和non-WSDL模式。這兩種模式的意義跟 SoapClient的兩種模式一樣。在WSDL模式中,服務實現了WSDL提供的介面;在non-WSDL模式中,引數被用來管理服務的行為。
在SoapServer類的眾多方法中,有三個方法比較重要。它們是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。
下面給出例項:
定義一個提供服務的php類,這個類所提供的函式就是web service對外提供的服務
<?php
Class PersonInfo
{
/**
* 返回姓名
* @return string
*
*/
public function getName(){
return "My Name is Chance";
}
}
?>
下面給出伺服器端的程式碼:
1 <?php
2 //包含提供服務的類進來
3 require_once('PersonInfo.php');
4
5 //wsdl方式提供web service,如果生成了wsdl檔案則可直接傳遞到//SoapServer的建構函式中
6 //$s = new SoapServer('PersonInfo.wsdl');
7
8 //doesn't work 只有location不能提供web service
9 //output:looks like we got no XML document
10 //$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));
11
12 //下面兩種方式均可以工作,只要指定了相應的uri
13 //$s = new SoapServer(null,array("uri"=>"Server.php"));
14 $s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));
15
16 $s -> setClass("PersonInfo");
17
18 $s -> handle();
19 ?>
下面是客戶端程式碼:
1 <?php
2 try{
3 //wsdl方式呼叫web service
4 //wsdl方式中由於wsdl檔案寫定了,如果發生新增刪除函式等操作改動,不會反應到wsdl,相對non-wsdl方式
5 //來說不夠靈活
6 //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl");
7
8 //non-wsdl方式呼叫web service
9 //在non-wsdl方式中option location系必須提供的,而服務端的location是選擇性的,可以不提供
10 $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));
11
12 //兩種呼叫方式,直接呼叫方法,和用__soapCall簡接呼叫
13 $result1 = $soap->getName();
14 $result2 = $soap->__soapCall("getName",array());
15 echo $result1."<br/>";
16 echo $result2;
17
18 }catch(SoapFault $e){
19 echo $e->getMessage();
20 }catch(Exception $e){
21 echo $e->getMessage();
22 }
23
24 ?>
相關推薦
phpsoap soapclient引數詳解
An array of options. If working in WSDL mode, this parameter is optional. If working in non-WSDL mode, you must set the location and uri options, where lo