對這文章發表回應
發表限制: 非會員 可以發表
發表者: 冷日 發表時間: 2010/10/18 12:55:04
實戰WebService I: XML-PRC篇(基於php)
XML-RPC是一種簡單的,輕量級的通過HTTP協議進行RPC通信的規範。一個XML-RPC消息就是一個請求體為XML的HTTP-POST請求,被調用的方法在服務器端執行並將執行結果以XML格式編碼後返回。 XML-RPC 和SOAP是創建web services的兩種標準協議。XML-RPC是出現較早的(也比較簡單),而SOAP較新,也比較複雜。Microsoft的.NET就是基於 SOAP,而很多流行的WEB程序,如Frontier和blogger,則提供XML-RPC接口。
PHP通過xmlrpc擴展提供SOAP和XML-RPC的訪問途徑。xmlrpc基於xmlrpc-epi項目(更多信息請查看http://xmlrpc-epi.sourceforge.net)。xmlrpc擴展默認是不可用的,你需要在編譯PHP時加上–with-xmlrpc選項來啟用該擴展。
以下是通過ethereal抓到的一個典型的XML-RPC調用包(為便於閱讀,進行了格式化):
1. 請求報文格式
2. 報文返回格式
而對應的返回數據包為:
其格式很簡單,幾乎是不言自明的,分別用methodCall和methodResponse標籤標識發送給Server的調用請求和Server的返回結果,請求方法的名稱用methodName標識,參數用params和param標識,而參數的類型標籤則如下表所示:
示例
XML-RPC需要PECL擴展支持,在Windows下,對應的dll文件是:php_xmlrpc.dll
寫一個XML-RPC服務器
客戶端
XML-RPC客戶端的主要工作是發出HTTP請求和解析服務器發回的響應。PHP所帶的xmlrpc擴展可以將XML-RPC請求用XML編碼,但它不知道如何發送HTTP請求。如果要具有這樣的功能,可以從http://xmlrpc-epi.sourceforge.net下載xmlrpc-epi程序包,然後安裝其中的sample/utils/utils.php文件。該文件包含一個可以執行HTTP請求的函數。
還有一些XML-RPC特性這裡未提及,如XML-RPC的數據類型並不總是與PHP的數據類型精確對應,但可以將這些值編碼成特殊的數據類型而不採用 xmlrpc擴展通過最佳猜測選擇的數據類型。當然,PHP的xmlrpc擴展的一些特性我們也沒有介紹,如SOAP錯誤。想知道全部細節,請查看http://www.php.net , 上面有xmlrpc擴展的詳細文檔。
原文出處:实战WebService I: XML-PRC篇(基于php) - 百草园 - JavaEye技术网站
XML-RPC是一種簡單的,輕量級的通過HTTP協議進行RPC通信的規範。一個XML-RPC消息就是一個請求體為XML的HTTP-POST請求,被調用的方法在服務器端執行並將執行結果以XML格式編碼後返回。 XML-RPC 和SOAP是創建web services的兩種標準協議。XML-RPC是出現較早的(也比較簡單),而SOAP較新,也比較複雜。Microsoft的.NET就是基於 SOAP,而很多流行的WEB程序,如Frontier和blogger,則提供XML-RPC接口。
PHP通過xmlrpc擴展提供SOAP和XML-RPC的訪問途徑。xmlrpc基於xmlrpc-epi項目(更多信息請查看http://xmlrpc-epi.sourceforge.net)。xmlrpc擴展默認是不可用的,你需要在編譯PHP時加上–with-xmlrpc選項來啟用該擴展。
以下是通過ethereal抓到的一個典型的XML-RPC調用包(為便於閱讀,進行了格式化):
1. 請求報文格式
POST /xmlrpc HTTP/1.1
Content-Type: text/xml
User-Agent: Apache XML RPC 3.0 (Jakarta Commons httpclient Transport)
Host: 135.252.156.147:8080
Content-Length: 260
<?xml version="1.0" encoding="UTF-8"?>
<methodCall xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
<methodName>Calculator.add</methodName>
<params>
<param>
<value>
<i4>2</i4>
</value>
</param>
<param>
<value>
<i4>3</i4>
</value>
</param>
</params>
</methodCall>
2. 報文返回格式
而對應的返回數據包為:
HTTP/1.1 200 OK
Server: Apache XML-RPC 1.0
Connection: close
Content-Type: text/xml
Content-Length: 189
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
<params>
<param>
<value>
<i4>5</i4>
</value>
</param>
</params>
</methodResponse>
其格式很簡單,幾乎是不言自明的,分別用methodCall和methodResponse標籤標識發送給Server的調用請求和Server的返回結果,請求方法的名稱用methodName標識,參數用params和param標識,而參數的類型標籤則如下表所示:
示例
XML-RPC需要PECL擴展支持,在Windows下,對應的dll文件是:php_xmlrpc.dll
寫一個XML-RPC服務器
<?php
//該函數暴露給客名端的名稱為「multiply( )」
function times ($method, $args) {
return $args[0] * $args[1];
}
$request = $HTTP_RAW_POST_DATA;
if (!$request) $request_xml = $HTTP_POST_VARS['xml'];
$server = xmlrpc_server_create( );
if (!$server) die("Couldn't create server");
xmlrpc_server_register_method($server, 'multiply', 'times');
$options = array('output_type' => 'xml', 'version' => 'auto');
echo xmlrpc_server_call_method($server, $request, null, $options);
xmlrpc_server_destroy($server);
?>
客戶端
XML-RPC客戶端的主要工作是發出HTTP請求和解析服務器發回的響應。PHP所帶的xmlrpc擴展可以將XML-RPC請求用XML編碼,但它不知道如何發送HTTP請求。如果要具有這樣的功能,可以從http://xmlrpc-epi.sourceforge.net下載xmlrpc-epi程序包,然後安裝其中的sample/utils/utils.php文件。該文件包含一個可以執行HTTP請求的函數。
<?php
require_once('utils.php');
$options = array('output_type' => 'xml', 'version' => 'xmlrpc');
$result = xu_rpc_http_concise(
array(method => 'multiply',
args => array(9, 6),
host => 'localhost',
uri => '/php/rpc_webservice/xmlrpc_server.php',
options => $options)
);
//echo $result;
echo "9 * 6 is $result";
?>
還有一些XML-RPC特性這裡未提及,如XML-RPC的數據類型並不總是與PHP的數據類型精確對應,但可以將這些值編碼成特殊的數據類型而不採用 xmlrpc擴展通過最佳猜測選擇的數據類型。當然,PHP的xmlrpc擴展的一些特性我們也沒有介紹,如SOAP錯誤。想知道全部細節,請查看http://www.php.net , 上面有xmlrpc擴展的詳細文檔。
原文出處:实战WebService I: XML-PRC篇(基于php) - 百草园 - JavaEye技术网站