首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 構建 XML-RPC 遠程服務實戰(上):標準協議與客戶端開發

     編輯:PHP 綜合知識

服務導向 Web 的必然趨勢

Web 從文檔集散地演進為服務平台。B2B/B2C 協同本質是服務調用。表現層(HTML)之下需要統一服務層,支援瀏覽器、行動裝置、家電等異構終端。XML-RPC 正是這層標準協議。

XML-RPC 核心概念

  • RPC = Remote Procedure Call,分布式計算基石
  • XML-RPC:以 HTTP 為傳輸,XML 為編碼,實現跨語言、跨平台遠程調用
  • 服務端提供「過程」(Procedure),客戶端調用並獲得結果
  • 規範來源:xmlrpc.com/spec

協議細節

請求

POST /RPC2 HTTP/1.0
Content-Type: text/xml

<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName</methodName>
  <params>
    <param><value><i4>41</i4></value></param>
  </params>
</methodCall>

資料型別

標籤型別範例
<i4> / <int>32-bit 有號整數12
<boolean>布林0/1
<string>字串Hello World
<double>雙精度浮點-12.214
<dateTime.iso8601>日期時間19980717T14:08:55
<base64>二進位eW91IGbid0IHJlQgdGhpcyE=

結構與陣列

<struct>
  <member><name>name</name><value><string>member1</string></value></member>
  <member><name>age</name><value><i4>19</i4></value></member>
</struct>

<array>
  <data>
    <value><boolean>0</boolean></value>
    <value><i4>9</i4></value>
    <value><string>Hello</string></value>
  </data>
</array>

回應

<?xml version="1.0"?>
<methodResponse>
  <params>
    <param><value><string>ABCDEFG</string></value></param>
  </params>
</methodResponse>


<fault>
  <value><struct>
    <member><name>faultCode</name><value><int>4</int></value></member>
    <member><name>faultString</name><value><string>Error!</string></value></member>
  </struct></value>
</fault>

PHP 實作:UsefulInc XML-RPC 函式庫

下載:xmlrpc.usefulinc.com

  • xmlrpc.inc:客戶端類別
  • xmlrpcs.inc:服務端類別

客戶端開發六步驟

  1. 建立 XML-RPC 訊息:new xmlrpcmsg($methodName, $paramArray)
  2. 建立客戶端:new xmlrpc_client($path, $host, $port)
  3. 發送:$client->send($msg) 回傳 xmlrpcresp
  4. 檢查錯誤:$resp->faultCode()
  5. 取得值:$resp->value() 回傳 xmlrpcval
  6. 轉換:$val->scalarval() 或 xmlrpc_decode($val)(陣列/結構)

客戶端完整範例

<?php
include("xmlrpc.inc");

$f = new xmlrpcmsg('examples.getStateName', array(new xmlrpcval(14, "int")));
$c = new xmlrpc_client("/RPC2", "betty.userland.com", 80);
$r = $c->send($f);
$v = $r->value();

if (!$r->faultCode()) {
    print "狀態代碼 14 是 " . $v->scalarval() . "<BR>";
    print "<HR>原始回應<BR><PRE>" . htmlentities($r->serialize()) . "</PRE><HR>";
} else {
    print "錯誤: 代碼 " . $r->faultCode() . " 原因: '" . $r->faultString() . "'<BR>";
}
?>

建構複雜參數

<?php
// 陣列
$myArray = new xmlrpcval(array(
    new xmlrpcval("Tom"),
    new xmlrpcval("Dick"),
    new xmlrpcval("Harry")
), "array");

// 結構
$myStruct = new xmlrpcval(array(
    "name" => new xmlrpcval("Tom"),
    "age"  => new xmlrpcval(34, "int"),
    "geek" => new xmlrpcval(1, "boolean")
), "struct");
?>

編碼/解碼輔助函數

  • xmlrpc_encode($phpval):PHP 變數 → xmlrpcval(遞迴支援陣列/結構)
  • xmlrpc_decode($xmlrpc_val):xmlrpcval → PHP 原生陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved