1. 程式人生 > >PHP的soap使用

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