龍軍



摘要:該文在分析分布式異構系統及面向服務架構基礎上,對WebService和Restful WebService進行比較,研究基于PHP+Apache的分布式系統構架,最后從數據庫操作、Restful WebService的制作、HTML5前端、Android客戶端等方面進行系統的研究和模型設計。
關鍵詞:分布式; PHP; WebService; Restful WebService
中圖分類號:TP311? ? ? 文獻標識碼:A? ? ? 文章編號:1009-3044(2018)35-0087-03
隨著計算機軟硬件及網絡技術的發展,軟件系統規模、應用領域、實現功能不斷擴大,基于資源共享、高可用和并行處理的分布式異構系統成為解決復雜應用的有力工具。
1 分布式異構系統(DHS)及面向服務架構(SOA)概述
分布式系統是基于網絡具有高內聚性和透明性的軟件系統,異構系統由不同硬件設備、操作系統、應用軟件、數據等構成,通過消息中間件在不同應用間提供統一運行的框架和接口,實現跨平臺數據傳輸,共同完成應用任務,并通過動態增加或減少業務端,使業務系統具有良好的動態負載伸縮能力。
面向服務架構以基于XML/SOAP/Web Service/SCA/SDO/UDDI標準、可重用數據、業務服務組件為基礎,圍繞業務流程,對業務邏輯進行高度抽象的架構模型和軟件開發方式,將異構平臺上不同應用的功能組件封裝成有良好定義、與平臺無關、標準、可拼接拆卸、可復用的服務,形成松散耦合的軟件系統。功能為獨立服務,通過如REST、SOAP等遠程通信協議,借助中間件來實現SOA需求。
2 WebService和Restful WebService的比較
WebService是跨編程語言及操作系統平臺的遠程調用技術,為網絡應用開發和使用提供統一的編程模型,通常被定義為一組模塊化API供外部使用,有基于WSDL、UDDI的簡單對象訪問協議(SOAP)方式和REST方式兩種。
SOAP協議方式的消息通過增加特定HTTP消息頭統一內容格式,用XML格式封裝數據,用HTTP協議進行傳輸,用XSD定義標準的數據類型,將所有使用的數據類型均轉換為XSD類型。WSDL用XML描述WebService及其函數、參數和返回值,保存在Web服務器上,通過URL訪問,用UDDI發現WebService。
REST是一面向資源的架構風格,是一組架構約束條件和原則,滿足約束條件和原則的程序就是RESTful。REST專門針對網絡應用設計和開發,降低開發復雜性,提高系統可伸縮性,將網絡上所有事物都抽象成有唯一標識的資源。REST所有操作均無狀態,遵循CRUD原則,只需創建POST、獲取GET、更新PUT和刪除DELETE四種行為就可完成相關操作和處理,通過統一簡短的資源標識符(URI)來識別和定位資源,并通過HTTP規范資源操作。
3 基于PHP的分布式系統構架設計
PHP是開源跨平臺的服務器端嵌入式腳本語言,已發展成完整的面向對象程序設計語言,語法簡單、強大的數據庫支持、在服務器端執行、會將用戶常訪問的程序駐留內存、效率高,得到廣泛應用。
本模型基于PHP+Apache+MySql,用PHP的類完成數據增刪改查等操作,用SOAP WebService和Restful WebService對前端請求進行合法判斷,調用類進行數據處理,返回JSON格式數據給前端,前端為Web應用、移動端的Native App和Web App應用,在本模型中原生程序基于Android、Web App用HTML5。
4 數據庫操作類
PHP數據對象PDO擴展定義了輕量級的接口訪問數據庫,提供了一數據訪問的抽象,對所有數據庫均可用相同的函數/方法來操作。在類的構造方法__construct()中設置服務器地址、數據庫名以及登錄名和密碼。創建連接數據庫函數conn()連接服務器并選擇數據庫:
$link=new PDO("mysql:host=$hostname;dbname=$db_name", $username,$password);
通過傳入sql語句,完成表的增刪改函數zcg($sql):$this→link→exec($sql)。
[傳入sql語句查詢一條記錄 傳入sql語句查詢符合條件的多條記錄 $result=$this->link->query($sql);
if($row=$result->fetch_object()){
$a=array('id'=>$row->Id,'yhm'=>$row->yhm,'mm'=>$row->mm);
$json=json_encode($a);
}else
$json='{"id":"0"}}'; $result=$this->link->query($sql);
$num=$result->num_rows;
$a=array();
while($row=$result->fetch_object()){
$b=array('id'=>$row->Id,'yhm'=>$row->yhm,'mm'=>$row->mm);
$a[$i]=json_encode($b);
$i=$i+1;} ]
5 Restful WebService
1) RESTful 基礎類:新建一個RESTful基類,用于處理響應請求的HTTP狀態碼。
[private $httpVersion = "HTTP/1.1";
public function setHttpHeaders($contentType, $statusCode){
$statusMessage = $this -> getHttpStatusMessage($statusCode);
header($this->httpVersion. " ". $statusCode ." ". $statusMessage);
header("Content-Type:". $contentType);}
public function getHttpStatusMessage($statusCode){
$hs = array(100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK',...);
return ($hs[$statusCode]) ? $hs[$statusCode] : $status[500];} ]
2) RESTful WebService處理類:新建一個RESTful基類的子類,根據接收到的Content-Type,將Request類返回的數據轉換為對應的格式,加上header后輸出HTTP 狀態碼及數據。
[多條記錄getYhbRows($kw) 一條記錄getYhbRow($id) $yhb = new yhb();
$sql="select * from yhb where yhm like ‘%”+$key+”% order by Id desc";
$rawData = $yhb->getRows($sql);
if(empty($rawData)) {
$sCode = 404;
$rawData = array('error' => '無記錄!');
} else? $sCode = 200;
$rcType = $_SERVER['HTTP_ACCEPT'];
$this ->setHttpHeaders($rcType, $sCode);
echo $rawData; $yhb = new yhb();
$sql="select * from yhb where id="+$id;
$rawData = $yhb->getRow($sql);
if(empty($rawData)) {
$sCode = 404;
$rawData = array('error' => '無記錄!');
} else
$sCode = 200;
$rcType= $_SERVER['HTTP_ACCEPT'];
$this ->setHttpHeaders($rcType, $sCode);
echo $rawData; ]
3) RESTful WebService控制器:包含一數據操作的Request類,接收到URL的數據后,根據請求URL的GET、POST、PUT、PATCH、DELETE方式對數據進行相應的增刪改查操作,并返回操作后的結果。要注意的是在PHP文件開始時允許跨域。
[header("Access-Control-Allow-Origin:*");
$method=$_SERVER['REQUEST_METHOD'];
$view = "";
if(isset($_GET["view"]))? $view = $_GET["view"];
$yhbHandler = new YHBHandler();
if($view=="all") $yhbHandler ->getYhbRows();
else if($view=="single") $yhbHandler ->getYhbRow($_GET["id"]); ]
4) RESTful Services URI映射:設置一直觀簡短的資源地址,在配置文件htaccess中設置相應的Rewrite規則實現URL重寫(rewrite)與重定向(redirect)。
[# 開啟 rewrite 功能
Options +FollowSymlinks
RewriteEngine on
# 重寫規則
RewriteRule ^list/$? ?YhbController.php?view=all [nc,qsa]
RewriteRule ^read/([0-9]+)/$? ?YhbController.php?view=single&id=$1 [nc,qsa] ]
6 基于HTML5的Web端和移動端
Web應用及移動端的Web App通過jQuery的post、get方法進行數據處理及交互。
[GET方式 POST方式 $.get("網址/read/"+$("#id").val()+"/",
function(data){
json=JSON.parse(data);
$("#xs").html("id=" + json.id + "<br>用戶名=" + json.yhm + "<br>密碼=" + json.mm);
},"json"); $.post("網址/list/",{kw:$("#kw").val()},
function(data){
var a1=JSON.parse(data);
if(a1.length>0){var str="";
for(var i=0;i<a1.length;i++){
var a=JSON.parse(a1[i]);
str+="id:"+a.id+",用戶名:"+a.yhm+",密碼:"+a.mm+"<br>";}
$("#xs").html(str);}},"json"); ]
7 Android端原生應用
在Android中可用HttpPost和HttpGet封裝post請求和get請求,用HttpClient的excute()發送post請求并返回服務器響應數據。用HttpResponse的getAllHeaders()、getHeaders(String name)等獲取服務器的響應頭,用getEntity()獲取包裝有服務器響應內容的HttpEntity對象,程序通過該對象獲取服務器的響應內容。
[GET方式 POST方式 String urls="網址/read/"+id+"/";
HttpClient hc=new DefaultHttpClient(); String urls="網址/list/";
HttpPost hp=new HttpPost(urls);
List<NameValuePair> p=new ArrayList<NameValuePair>(); HttpGet hg=new HttpGet(urls);
HttpResponse hr=hc.execute(hg);
HttpEntity he=hr.getEntity();
r=EntityUtils.toString(he,"utf-8"); p.add(new BasicNameValuePair("kw",e.getText().toString()));
hp.setEntity(new UrlEncodedFormEntity(par,"utf-8"));
HttpClient hc=new DefaultHttpClient();
HttpResponse hr=hc.execute(hp);
HttpEntity he=hr.getEntity();
r=jtos(EntityUtils.toString(he,"utf-8")); ]
在模型應用間采用JSON格式數據進行傳輸,JSON是輕量級的數據交換語言,JSON和XML均有相同的數據可讀性和豐富的解析手段,JSON相較XML數據體積小、與JavaScript交互更方便、速度快,但JSON的數據描述性差。
RESTful架構層次分明、結構清晰,輕量級JSON格式在數據交換中易訪問、可擴展,能輕易實現多種數據、多種服務的聚合,提高了軟件系統的開發效率,基于PHP的分布式應用系統開發應用面將越來越廣。
參考文獻:
[1] 王非. RESTful Web Services在信息系統中的應用[J]. 計算機系統應用,2013(22).
[2] 萬為清. WebService技術在分布式開發中的應用與實現[J]. 電腦編程技巧與維護,2017(18).
[3] 徐曉琴. 基于WebService技術的SAP接口實現[J]. 電腦知識與技術,2018(14).
[4] 張琛. 分布式軟件系統交互行為建模、驗證與測試[J]. 計算機研究與發展,2015(52).
[5] 黃博怡. Web Services技術手段在異構系統集成中的應用實踐[J]. 現代工業經濟和信息化,2017(9).
[通聯編輯:梁書]