茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729059 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00077.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

PHP特區 : [轉貼]PHP and Web Services 學習筆記

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]PHP and Web Services 學習筆記
PHP and Web Services 學習筆記
作者:edong www.edong.org (2005-04-13 11:54:58)

全文分為三個部分:
概述。PHP進行Web Services開發的優點,在Unix系統上安裝配置PHP
在PHP中使用SOAP。NuSOAP 工具包,NuSOAP的高級Web Service功能,如HTTP代理,SOAP over HTTPS,document style messaging。還將討論如何解決一些PHP Web Services編程將會遇到的問題,如安全問題,語言到數據類型的映射
PHP中的XML-RPC。XML-RPC的特性,XML-RPC與SOAP的對比,然後使用Useful, Inc.實現來創建XML-RPC的客戶端和服務器程序
下面是第一部分。

Section 1. 概述
PHP 中已經通過綁定了Expat parser內置了XML支持,額外的還可以使用一些擴展程序(extension),如domxml(通過使用libxml庫提供DOM, Xpath, Xlink支持),xslt(為複雜的第三方XSLT庫如Sablotron和libxslt提供的外包程序)。

另一個對 Web Service 開發有用的PHP擴展程序是CURL(Client URL Library)。CURL允許你通過不同的協議,如HTTP, HTTPS, FTP, telnet, LDAP來通訊,其中的HTTPS對Web Services與服務器進行安全連接尤其有用。

SOAP vs XML-RPC 優缺點:
強大的類型擴展 (SOAP)
用戶自定義字符集,如US-ASCII, UTF-8, UTF-16 (SOAP)
Specifies recipient [指定容器?] (SOAP)
容器遇到無法理解的報文則失敗 (SOAP)
易於使用 (XML-RPC)
設計簡單 (XML-RPC)

配置PHP:
Apache: 為了讓PHP作為Apache的模塊方式運行,使用 --with-apxs選項編譯,如 --with-apxs=/www/bin/apxs。[我現在使用的Apache2, 我編譯的PHP使用的選項是--with-apxs2=/usr/sbin/apxs]
DOMXML: 可選功能,對解析XML文檔十分有幫助。需要預先安裝好libxml庫(版本>=2.4.2),編譯時使用 --with-dom=DIR 選項(缺省DIR為/usr)
http://www.xmlsoft.org/downloads.html
libxml 2.6.4 - sources - 2.52 MB

XSLT: 可選功能,對轉換XML資料為其他類型的文檔有幫助。編譯時使用 --enable-xslt --with-xslt-sablot 選項。必須預先安裝Sablotron XSLT庫(http://www.gingerall.com/),(缺省DIR為/usr/lib或者/usr/local/lib)。
Sablotron 1.0.1 - sources - 470 kB

CURL: 如前所述,若提供SSL支持則是必須安裝的。編譯時使用 --with-curl=DIR 選項。也同樣需要預先安裝CURL庫(版本>=7.0.2-beta)。 [我的PHP已經安裝了。CURL Information: libcurl/7.10.7 OpenSSL/0.9.7c zlib/1.1.4]

Section 2. SOAP
NuSOAP介紹:
NuSOAP是一組開源的,用來通過HTTP收發SOAP消息的PHP類,由NuSphere Corporation (http://www.nusphere.com
) 開發。NuSOAP的一個優勢是他不是一個擴展程序,而是純粹用PHP代碼寫的,所以適用範圍比較廣。

安裝配置:
http://dietrich.ganx4.com/nusoap/ 下載,從zip文件中解出nusoap.php文件放到include目錄,在你的腳本前面加上
include('nusoap.php');
就搞定了。

範例:
下面是一個簡單的SOAP client程序: soap_client.php 執行
//simple client
require('nusoap.php');

//要發送的變量
$myString="world";

//parameters must be passed as an array
//變量必須要轉換成數組的形式
$parameters=array($myString);

//創建一個soapclient對象,參數是server的URL
$s=new soapclient('http://www.douzi.org/me/php_ws/soap_server.php');

//調用遠程方法,返回值存放在$result
//返回值為PHP的變量類型,如string, integer, array
$result=$s->call('echoString', $parameters);

//錯誤檢測
if (!$err=$s->getError()) {
echo 'Result: '.$result; //success
} else {
echo 'Error: '.$err;
}

//調試,以下是SOAP請求(request)和回應(response)的報文,包括HTTP頭
echo "<xmp>".$s->request."</xmp>";
echo "<xmp>".$s->response."</xmp>";

?>



相應的server端程序: soap_server.php
//simple server
require('nusoap.php');

//創建一個新的soap_server對象,並註冊允許遠程調用的方法
$s=new soap_server;
$s->register('echoString');
$s->register('echoArray');

/*
[文章中說:
缺少了註冊這一步,任何PHP函數都將可以進行遠程調用,這將是一個極大的安全隱患。
但是我嘗試過註冊是必須的。
而且只有將結果return的函數才能直接聲明為遠程方法,比如echo()就不行,而strtolower()就可以。]
*/

function echoString($inputString) {
//類性檢查
if(is_string($inputString)) {
return "Hello, ".$inputString;
} else {
//soap_fault類用於產生錯誤信息
return new soap_fault('client', '', 'The parameter to this service must be a string.');
//soap_fault(faultcode, faultactor, faultstring, faultdetail);
//上面是錯誤處理類的構造函數的格式
//faultcode 必須值。可以設置為client或server,來表明錯誤發生在哪一端。
//faultactor 在NuSOAP中尚未實現。
//faultstring 錯誤信息。
//faultdetail 詳細錯誤信息。你可以使用XML標記。

//除了構造函數外,soap_fault類還有一個serialize()方法
//它將錯誤信息序列化,然後返回一個完整的SOAP報文,範例:
/*
$fault = new soap_fault('client', '', 'The inputString parameter must not be empty');
echo $fault->serialize();
*/
}
}

//演示數組類型的使用
function echoArray($inputString) {
return $inputString[0]."+".$inputString[1];

}

//最後一步是把所有的收到的post數據都傳遞給SOAP server的service方法。它將處理請求,並調用相應的函數。
$s->service($HTTP_RAW_POST_DATA);
?>


複雜數據類型的使用:
數組。以下是生成的SOAP的Body部分代碼:
string1
string2


生成復合數據類型(compound types samples),使用soapval。以下是生成的SOAP的Body部分代碼:
123 Freezing Lane
Nome
Alaska
12345

1234567890
0987654321


程序範例: soapval.php 執行
//soapval: general compound types samples
include('nusoap.php');

$address=array(
'street'=>'123 Freezing Lane',
'city'=>'Nome',
'state'=>'Alaska',
'zip'=>12345,
'phonenumbers'=>array('home'=>'1234567890', 'mobile'=>'0987654321')
);

$s=new soapval('myAddress', 'address', $address, '', 'http://myNamespace.com');

print "<xmp>".$s->serialize()."</xmp>";

?>


WSDL
WSDL是一種用於描述Web Service的XML語言。它是一種機讀格式,把所有的訪問服務所必須的信息提供給Web Service客戶端。NuSOAP專門提供一個類進行WDSL文件的解析,並且從中提取信息。soapclient對像使用wsdl類來減輕開發者調用服務的難度。通過WSDL信息的幫助來創建報文,程序員僅僅需要知道操作的名字和參數就能調用它。

通過NuSOAP使用WSDL提供以下幾點優點:
所有的服務元文件,如命名空間(namespaces),endpoint URLs,參數名(parameter names)等等都可以直接從WSDL文件獲得,這樣就允許客戶端動態的適應服務器端的變化。因為從服務器隨時可以獲得,所以這些數據不再需要在用戶腳本中使用硬性編碼。
它允許我們使用soap_proxy類。這個類派生自soapclient類,增加了WDSL文件中詳細列出的操作所對應的方法。現在用戶通過它可以直接調用這些方法。
soapclient 類包含一個getProxy()方法,它返回一個soap_proxy類的一個對象。soap_proxy類派生自soapclient類,增加了對應於 WSDL文檔中定義的操作的方法,並且允許用戶調用一個endpoint的遠程方法。這僅僅適用於soapclient對像用WDSL文件初始化的情況。優點是易於用戶使用,缺點是性能--PHP中創建對象是耗時的--且不為功利目的服務(and this functionality serves no utilitarian purpose)。

範例: wsdl.php 執行
//wsdl的一個簡單演示文件
include('nusoap.php');

//SOAP源為一個提供明星生卒年月的service
//首先我們創建一個soapclient對象,把WSDL文件的URL傳遞給構造函數,
//之後還要使用第二個參數以便使client知道我們傳遞過來的是WSDL,而不是SOAP endpoint。
$s=new soapclient('http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl', 'wsdl');

//生成proxy類
$p=$s->getProxy();

//調用遠程函數
$sq=$p->getTodaysBirthdays();

if (!$err=$p->getError()) {
print_r($sq);
} else {
print "ERROR: $err";
}

print 'REQUEST:<xmp>'.$p->request.'</xmp>';
print 'RESPONSE:<xmp>'.str_replace('><', ">\n<", $p->response).'</xmp>';

?>


(http://www.fanqiang.com)

原文鏈接:http://www.edong.org/main/content/view/442/38/1/1/


原文出處:PHP and Web Services 学习笔记 - fanqiang.com
前一個主題 | 下一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|