php soap 開(kāi)發(fā)文檔
一. 必備知識(shí)
1.wsdl(web服務(wù)標(biāo)記語(yǔ)言)
WSDL(網(wǎng)絡(luò)服務(wù)描述語(yǔ)言,Web Services Description Language)是一門(mén)基于 XML 的語(yǔ)言,用于描述 Web Services 以及如何對(duì)它們進(jìn)行訪問(wèn)。
具體參考請(qǐng)?jiān)L問(wèn)下面網(wǎng)址
http://theartemis.cn/wsdl/index.asp
2.soap
SOAP 是一種簡(jiǎn)單的基于 XML 的協(xié)議,它使應(yīng)用程序通過(guò) HTTP 來(lái)交換信息。
具體參考請(qǐng)?jiān)L問(wèn)下面網(wǎng)址
http://theartemis.cn/soap/index.asp
3.php擴(kuò)展
具體參考請(qǐng)?jiān)L問(wèn)下面網(wǎng)址
http://php.net/manual/en/book.soap.php
二. php soap開(kāi)發(fā)模式
1. working in swdl mode(契約先行(Contract first)模式)
契約先行模式使用了一個(gè)用XML定義的服務(wù)接口的WSDL文件。WSDL文件定義了服務(wù)必須實(shí)現(xiàn)或客戶(hù)端必須使用的接口。SoapServer和SoapClient的WSDL模式就基于這個(gè)概念。也就是用soap通訊的時(shí)候必須先有一個(gè)定義過(guò)的服務(wù)接口,才能進(jìn)行通訊。
2. working in non-swdl mode(代碼先行(Code first)模式)
在代碼先行模式中,首先要先寫(xiě)出實(shí)現(xiàn)服務(wù)的代碼。然后在大多數(shù)情況下,代碼會(huì)產(chǎn)生一個(gè)契約,換種說(shuō)法,一個(gè)WSDL。接著客戶(hù)端在使用服務(wù)的時(shí)候就可以使用那個(gè)WSDL來(lái)獲得服務(wù)的接口。盡管如此,PHP5的擴(kuò)展并沒(méi)有從代碼輸出一個(gè)WSDL的規(guī)定,考慮到這種情況,可以在non-WSDL模式下使用 SoapServer和SoapClient。也就是說(shuō)在soap通訊的時(shí)候并不需要一個(gè)預(yù)先定義過(guò)的服務(wù)接口,代碼會(huì)自動(dòng)的產(chǎn)生。
三.參考例子:
下面介紹如何使用WSDL模式和non-WSDL模式來(lái)實(shí)現(xiàn)服務(wù)和客戶(hù)端。相對(duì)而言,使用WSDL模式來(lái)實(shí)現(xiàn)服務(wù)和客戶(hù)端會(huì)比較容易。
1. noWSDL模式實(shí)現(xiàn)
服務(wù)端 server.php
<?php
class test
{
/**
*
* @return string
*/
function show()
{
return 'hello world!';
}
}
#####################################################
$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->setClass('test');
$server->handle();
?>
客戶(hù)端 client.php
<?
$soap=new SoapClient(null, array(
'location' =>'http://soapserver_url/server.php',
'uri' => "http://test-uri/"));
print_r($soap->__getFunctions());
echo $soap->show();
?>
2. WSDL模式實(shí)現(xiàn)
第一步:編寫(xiě)服務(wù)端類(lèi)文件
class..php
<?php
class test
{
/**
*
* @return string
*/
function show()
{
return 'hello world!';
}
}
?>
第二步:將類(lèi)文件生成 wsdl文件server.wsdl。
由于wsdl文件編寫(xiě)比較復(fù)雜,所以我們用第三方工具生成。我們以zend studio為例子演示:
Tools ==> WSDL Generator ==> Configration name : test; WSDL file name: server
==>NEXT ==> 點(diǎn)擊 + ==> 選擇上面的創(chuàng)建的class.php ==> 這時(shí)候會(huì)看到一個(gè) classes?? : URL Location的映射,保留 test類(lèi)前面的勾,并將其url 設(shè)置為 SOAP Server的url:http://soapserver_url/server.php ==>點(diǎn)擊Finish,ZDE就會(huì)創(chuàng)建一個(gè)非常漂亮的WSDL了?? 工作基本上完成了.
第三步:服務(wù)端編寫(xiě):
<?php
require ' class..php '; //引入類(lèi)文件
$server = new SoapServer('server.wsdl');
$server->setClass('test');
$server->handle();
?>
第四步:客戶(hù)端編寫(xiě)
$soap = new SoapClient('http:// soapserver_url/server.wsdl');
print_r($soap->__getFunctions());
echo $soap->show();
以上兩個(gè)例子只是一個(gè)簡(jiǎn)單的soap服務(wù)編寫(xiě),已經(jīng)可以滿足大部分需要。如果需要更加高級(jí)的功能請(qǐng)參考其他方面的資料。
三. 出現(xiàn)的問(wèn)題。
1.在方法中對(duì)屬性的賦值在其他方法中不起作用。
比如在客戶(hù)端調(diào)用服務(wù)端某個(gè)方法對(duì)某個(gè)屬性賦值。
在其他方法里就不能用。但在 __construct 方法中對(duì)屬性的賦值是可以個(gè)在其他方法中使用的。
2. 提示 Client] looks like we got no XML document錯(cuò)誤。
服務(wù)器端文件在<?php ?> 標(biāo)簽前后都不要有任何數(shù)據(jù)包括空格,空行。
3. Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity
原因如下:PHP程序作為 SOAP客戶(hù)端 采用 WSDL 模式訪問(wèn)遠(yuǎn)端服務(wù)器的時(shí)候,PHP是通過(guò)調(diào)用 libcurl 實(shí)現(xiàn)的。至少在 PHP5.2.X 是這樣的。如果采用 non-WSDL 模式,就不需要 libcurl。在solaris 沒(méi)有缺省安裝 libcurl,也許是我沒(méi)有安裝。除了 了ibcurl以外,至少還關(guān)聯(lián)的庫(kù)包括:
libidn,ibgcc,libiconv,libintl,openssl
最近參與的項(xiàng)目,希望大家互相討論,共同進(jìn)步。
世界工廠網(wǎng) www.gongchang.com
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇