|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
接触MYSQL,开始设计数据库程序xml|近程办事 在PHP中使用XML手艺机关近程办事
将来的Web将是以办事为中间的Web,XML_RPC尺度使得编写和使用办事变得十分复杂。本文引见XML_RPC尺度及其PHP完成,并经由过程实例示范了若何在PHP中开辟XML_RPC办事和客户法式。
1、办事式Web
从内容供应商所采取的复杂办法到UDDI(Universal Description,Discovery and Integration)的将来构思,业界已有大批关于“办事式Web”的申明和评论。就Web的始创阶段来讲,它只是一个文档的集散地,供应的只是一些可阅读的信息。跟着Web的开展,在Web上运转办事愈来愈具有吸引力。将来,Web将成为企业为客户和其他企业供应便捷办事的载体。B2B和B2C形式间的协同就能够当作是一种办事式Web。
一个很主要的成绩是,Web上事实可以供应哪些办事?Web可以供应的办事十分多,个中有些办事如今已在利用,有些办事在不久的未来就会呈现。为了申明成绩,上面列出了一小局部可以经由过程Web供应的办事:
面向主题的垂直搜刮引擎。
供用户查找信息的常识库。
用户可以就教成绩的专家体系。
银行办事。
旧事和信息出书办事。
数字化付出相干的办事。
图形处置办事。
卫生和安康办事。
那末,企业和组织经由过程Web供应办事的准确路子是甚么呢?这是一个很主要的成绩。明天,有些办事供应HTML界面,它们经由过程文档的模式供应办事,但在办事界面的面前埋没着甚么?在占据Web的比赛中,Web阅读器其实不孑立,挪动德律风、手持装备和微波炉之类的装备都想要会见Web、查询数据库、转换数据、提守信息,等等。要完成真实的办事式Web,在体现层(HTML)之下应当还有别的一层。
2、XML_RPC尺度
XML也许是近10年来最为主要的尺度,XML辞汇表(Vocabulary)为企业机关办事情况供应了基石。要构建办事式Web就有需要进修XML_RPC尺度,这不但是由于XML_RPC关于把办事放到Web上很有效,并且由于XML_RPC是一种已成形的、很轻易采取的尺度。关于B2B办事来讲,供应办事的尺度是极为主要的,配合遵守尺度的公司可以使用其它公司供应的办事取得疾速的增加。没法想象在各类公有的办事尺度之上可以创立起真实的办事式Web,办事必需有一种可以遵守的尺度。
XML_RPC是一种面向Internet散布式处置的尺度。RPC即为Remote Procedure Call(近程进程挪用)的缩写,它是一种近程挪用机制,用于挪用能够驻留在其他机械之上和能够用其他言语编写的进程。近程进程挪用是散布式盘算的主要支柱。例如,在一个散布式盘算情况中,咱们可以寻觅和使用在其他机械上运转的履行加法和减法操作的进程,履行加法操作的进程能够用APL编写、在RS6000机械上运转,履行减法操作的进程能够用C编写、在Unix上运转。其他要利用这类散布式盘算器的开辟者一样可以使用它们,或他也能够选用别的更好的盘算器。
在RPC中,进程(Procedure)是最次要的构件,办事器供应的就是供客户端挪用的进程。进程可以吸收参数并前往了局。XML_RPC以HTTP作为协定载体,经由过程发送和吸收数据的XML辞汇表完成RPC机制。XML_RPC办事器吸收XML_RPC恳求并前往XML_RPC应对,XML_RPC客户法式发送XML_RPC恳求并吸收XML_RPC应对。办事器和客户必需依照XML_RPC尺度的请求处置应对和恳求。
3、XML_RPC协定
完全的XML_RPC标准可以在http://www.xmlrpc.com/spec找到。上面是其要点申明。
3.1 XML_RPC恳求
XML_RPC恳求应当是HTTP POST恳求,它的注释是XML格局。恳求的XML局部格局以下:
<?xml version="1.0" ?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
指定命据发送到哪里的URL并未在这里指定。假如办事器专门用来停止RPC处置,它多是“/”。上述XML文档中的无效载荷是一个“methodCall”布局。methodCall必需包括一个“methodName”子元素,“methodName”子元素包括一个描写待挪用办法的字符串。若何注释“methodName”的内容完整由办事器决意,例如它可所以一个履行文件的名字,可所以数据库中纪录的名字,或任何其他器材。假如进程吸收参数,“methodCall”可以包括一个“params”元素和若干个“param”子元素。每个“param”元素包括一个带有类型描写符的值,类型描写符以下表所示:
标志 申明
<i4>或<int> 四字节的带符号整数,如12
<boolean> 0(false),或1(true)
<string> 字符串,如“Hello World”
<double> 双精度带符号浮点数,如-12.214
<dateTime.iso8601> 日期/工夫,如19980717T14:08:55
<base64> base64编码的二进制数据,如eW91IGbid0IHJlQgdGhpcyE
3.1.1 布局
值可所以一个布局,布局用<struct>元素描写。每一个<struct>包括多个<member>,每一个<member>包括一个<name>和一个<value>。上面是一个由两个元素组成的布局:
<struct>
<member>
<name>name</name>
<value><string>member1</string></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>
<struct>可以嵌套,恣意<value>可以包括<struct>或恣意其它类型,包含<array>。
3.1.2 数组
值可所以数组类型,数组用<array>元素描写。每一个<array>元素包括一个<data>元素,<data>元素外面可以包括恣意多个<value>元素。上面是数组元素的一个例子:
<array>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><string>Hello</string></value>
</data>
</array>
<array>元素没着名字。如前例所示,<array>元素的值可所以各类类型。<array>元素可以嵌套,任何<value>都可以包括<array>或其他类型,如下面引见的<struct>。
3.2 XML_RPC应对
XML_RPC应对是一个HTTP应对,内容类型是text/xml。应对注释的格局以下:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>ABCDEFG</string></value>
</param>
</params>
</methodResponse>
<methodResponse>能够包括一个<params>布局,或能够包括一个<fault>布局,详细由进程挪用是不是胜利决意。<params>布局与XML恳求中的一样,<fault>元素的语法以下:
<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>
4、基于XML_RPC的Web办事
使用XML_RPC机关和利用办事是很便利的。企业为本人供应的各类办事安排XML_RPC办事器,用户、客户软件和客户企业就能够利用这类办事机关出高端办事或面向终究用户的使用。这类供应更无效、便宜和优良办事的竞争将极大地进步使用办事的质量。
但这里还存在一些成绩有待处理,例如如何编目、索引、搜刮Web上的办事?UDDI试图处理这个成绩,不外这个尺度其实不复杂,并且业界对它的反响也还没有了然。但是,在企业外部使用XML_RPC不但可以改良代码的可重用性,并且还会带来一种全新的散布式盘算形式,在尔后的数年中它势必成为一种主要的常识财富。XML_RPC的开展从处理散布式盘算成绩和成为办事式Web的根基层面入手下手,从而取得了一个十分好的初步,厥后势必紧跟着人们对该尺度的热中。既然如斯,如今就让咱们来看看XML_RPC的实践使用吧!
4.1 在PHP中使用XML_RPC
关于供应Web办事来讲,PHP是一种十分幻想的言语。咱们只需编写好PHP代码但是把它放到一个适合的地位,就当即有了一个可经由过程URL“挪用”的办事。PHP中的XML_RPC完成能够庞杂也能够复杂,但咱们具有很多种选择。这里咱们选用的是来自Useful Information Company的XML_RPC完成,它的代码和文档可以从http://xmlrpc.usefulinc.com/下载。
这个XML_RPC完成的根基类触及两个文件:
xmlrpc.inc:包括XML_RPC的php客户端所需求的类
xmlrpcs.inc:包括XML_RPC的php办事器所需求的类
4.2 客户端
编写XML_RPC客户端意味着:
1.创立一个XML_RPC恳求动静
2.设置XML_RPC参数
3.创立一个XML_RPC动静
4.发送动静
5.取得应对
6.注释应对
请看上面这个例子:
<?php
$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 "形态代码". $HTTP_POST_VARS["stateno"] . "是" .
$v->scalarval() . "<BR>";
print "<HR>这是办事器的应对<BR><PRE>" .
htmlentities($r->serialize()). "</PRE><HR>\n";
} else {
print "毛病: ";
print "代码: " . $r->faultCode() .
" 缘由: '" .$r->faultString()."'<BR>";
}
?>
在这个例子中,咱们先创立了一个挪用“examples.getStateName”办法的XML_RPC动静,并传递了一个类型为“int”值为14的整数参数。然后,咱们创立了一个描写待挪用URL(途径、域和端口)的客户。接着,咱们发送了动静,吸收应对对象并反省毛病。假如不存在毛病,咱们就显示了局。
编写RPC客户法式时要用到的次要函数以下:
创立客户用:
$client=new xmlrpc_client($server_path, $server_hostname, $server_port);
发送动静的办法是:
$response=$client->send($xmlrpc_message);
它前往的是xmlrpcresp的一个实例。咱们所传递的动静是xmlrpcmsg的实例,它用以下办法创立:
$msg=new xmlrpcmsg($methodName, $parameterArray);
methodName是待挪用的办法(进程)的名字,parameterArray是xmlrpcval对象的php数组。例如:
$msg=new xmlrpcmsg("examples.getStateName", array(new xmlrpcval(23, "int")));
xmlrpcval对象可以用以下模式创立:
<?php
$myVal=new xmlrpcval($stringVal);
$myVal=new xmlrpcval($scalarVal, "int" | "boolean" | "string" | "double" | "dateTime.iso8601" | "base64");
$myVal=new xmlrpcval($arrayVal, "array" | "struct");
?>
第一种模式创立的是xmlrpc字符串值。第二种模式创立的是描写值和类型的值。第三种模式经由过程在数组之类的布局中组合其他xmlrpc值创立庞杂的对象,例如:
<?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");
?>
应对对象是xmlrpcresp类型,经由过程挪用客户对象的send办法取得。在办事器端,咱们可以经由过程以下体例创立xmlrpcresp类型的对象:
$resp=new xmlrpcresp($xmlrpcval);
而在客户端,则利用以下办法从应对获得xmlrpcval:
$xmlrpcVal=$resp->value();
接上去咱们就能够用上面这类体例获得描写应对了局的PHP变量:
$scalarVal=$val->scalarval();
关于庞杂的数据类型,有两个函数十分有效,这两个函数都在xmlrpc.inc内:
$arr=xmlrpc_decode($xmlrpc_val);
该函数前往一个PHP数组,个中包括了xmlrpcval变量$xmlrpc_val以内的数据,这些数据已被转换成PHP自己具有的变量类型。
$xmlrpc_val=xmlrpc_encode($phpval);
该函数前往一个xmlrpcval类型的值,个中包括了$phpval描写的PHP数据。关于数组和布局,此办法可以停止递归剖析。注重,这里不存在对非根基数据类型(如base-64数据,或日期-工夫数据)的撑持。
4.3 办事器端
使用xmlrpcs.inc供应的类编写办事十分复杂。要创立一个办事,咱们依照以下体例创立xmlrpc_server的实例:
<?php
$s=new xmlrpc_server( array("examples.myFunc" =>
array("function" => "foo")));
?>
传递给xmlrpc_server机关函数的是一个结合数组的结合数组。进程“examples.myFunc”挪用“foo”函数,因为这个缘由foo被称为办法句柄。
编写办法句柄很复杂。上面是一个办法句柄的骨架:
<?php
function foo ($params) {
global $xmlrpcerruser; // 引入用户毛病代码值
// $params是一个xmlrpcval对象的数组
if ($err) {
// 毛病前提
return new xmlrpcresp(0, $xmlrpcerruser+1, // 用户毛病1
"Error!");
} else {
// 胜利
return new xmlrpcresp(new xmlrpcval("Fine!", "string"));
}
}
?>
可以看到,法式反省了毛病,如存在毛病则前往毛病(从$xmlrpcerruser+1入手下手);不然假如一切正常,则前往描写操作胜利信息的xmlrpcresp。
5、使用实例
鄙人面这个例子中咱们将机关一个办事。关于给定的数值n,办事前往n*2。客户端使用该办事盘算5*2的值。
办事器真个代码以下:
<?php
include("xmlrpc.inc");
include("xmlrpcs.inc");
function foo ($params)
{
global $xmlrpcerruser; // 引入用户毛病代码值
// $params是xmlrpcval对象的一个数组
$vala=$params->params[0];
$sval=$vala->scalarval();
$ret=$sval*2;
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
$s=new xmlrpc_server( array("product" =>
array("function" => "foo")));
?>
客户端代码以下:
<?php
include("xmlrpc.inc");
if ($HTTP_POST_VARS["number"]!="") {
$f=new xmlrpcmsg('product',array(new xmlrpcval($HTTP_POST_VARS["number"], "int")));
$c=new xmlrpc_client("/xmlrpc/servfoo.php", "luigi.melpomenia.com.ar", 80);
$c->setDebug(0);
$r=$c->send($f);
$v=$r->value();
if (!$r->faultCode()) {
print "Number ". $HTTP_POST_VARS["number"] . " is " .
$v->scalarval() . "<BR>";
print "<HR>来自办事器的了局!<BR><PRE>" .
htmlentities($r->serialize()). "</PRE><HR>\n";
} else {
print "操作掉败: ";
print "代码: " . $r->faultCode() .
" 缘由: '" .$r->faultString()."'<BR>";
}
}
print "<FORM METHOD=\"POST\">
<INPUT NAME=\"number\" VALUE=\"${number}\">
<input type=\"submit\" value=\"go\" name=\"submit\"></FORM><P>
输出一个数值";
?>
停止语:XML_RPC办事的运作还触及其他很多基本举措措施和基本任务,如散布式进程的编目和索引机制,又如在编程言语中处置XML_RPC的更好接口等。有关XML_RPC和办事式Web的报导十分多,让咱们亲切存眷它们的开展吧! 学习如何将PHP与HTML结合起来完成简单动态页面 |
|