在php中利用xml技术构造远程服务
未来的web将是以服务为中心的web,xml_rpc标准使得编写和应用服务变得非常简单。本文介绍xml_rpc标准及其php实现,并通过实例示范了如何在php中开发xml_rpc服务和客户程序。
一、服务式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)之下应该还有另外一层。
二、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标准的要求处理应答和请求。
三、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>
<member>
<name>name</name>
<value><string>member1</string></value>
</member>
<member>
<name>member2</name>
<value><i4>19</i4></value>
</member>
</struct>
3.1.2 数组
值可以是数组类型,数组用
<array>
<data>
<value><boolean>0</boolean></value>
<value><i4>9</i4></value>
<value><string>hello</string></value>
</data>
</array>
3.2 xml_rpc应答
xml_rpc应答是一个http应答,内容类型是text/xml。应答正文的格式如下:
<?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>
四、基于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。
五、应用实例
在下面这个例子中我们将构造一个服务。对于给定的数值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应用中,我们有时需要使用当前日期作为文件名来保存或上传文件。虽然可以手动输入日期,但使用当前日期作为文件名可以更方便、快捷和准确。在PHP中,我们可以使用date()函数来获取当前日期。该函数的使用方法为:date(format,timestamp);其中,format为日期格式字符串,timestamp为表示日期和时间的时间戳,不传递该参数将使用

教程:使用FirebaseCloudMessaging在PHP应用中实现定时消息推送功能概述FirebaseCloudMessaging(FCM)是谷歌提供的一种免费的消息推送服务,它能够帮助开发者向Android、iOS和Web应用发送实时消息。本教程将带领大家通过PHP应用使用FCM实现定时消息推送功能。步骤一:创建Firebase项目首先,在F

一、什么是泛型编程泛型编程是指在编程语言中实现一种通用的数据类型,使得这种数据类型能够适用于不同的数据类型,从而实现代码的复用和高效。PHP是一种动态类型语言,不像C++、Java等语言有强类型机制,因此在PHP中实现泛型编程不是一件容易的事情。二、PHP中的泛型编程方式PHP中有两种方式实现泛型编程:分别是使用接口和使用Trait。使用接口在PHP中创建一

Redis是一个高性能的key-value存储系统,它支持多种数据结构,其中包括字符串、哈希表、列表、集合、有序集合等。同时,Redis也支持对字符串数据进行正则表达式的匹配和替换操作,这使得它在开发PHP应用中具有很大的灵活性和便捷性。在PHP应用中使用Redis进行正则表达式操作,需要先安装好phpredis扩展,该扩展提供了与Redis服务器进行通信的

Redis在PHP应用中的操作日志在PHP应用中,使用Redis作为缓存或存储数据的方案已经变得越来越普遍了。Redis是一种高性能的键值存储数据库,具有快速、可扩展、高可用、数据结构多样等特点。在使用Redis时,为了更好地了解应用程序的运行情况,同时为了数据的安全性,我们需要有一份Redis操作日志。Redis操作日志能够记录Redis服务器上所有客户端

随着互联网技术的不断发展,搜索引擎的应用越来越广泛。在互联网的背景下,搜索引擎已成为用户获取信息的主要途径之一。而在此过程中,全文搜索技术起到了至关重要的作用。全文搜索通过对文本内容的建立索引,在用户查询时快速定位到匹配的文本。在PHP应用中实现全文搜索,有很多的方案,而本文将重点介绍Redis在PHP应用中的全文搜索。Redis是一个高性能的非关系型内存

在Web开发领域,Redis是一个非常流行的键值存储数据库,而PHP是一种广泛使用的Web编程语言。Redis提供了许多功能,其中一个非常有用的功能是Bitmap操作。Bitmap是Redis中的一种数据结构,它可以轻松地实现各种位图操作。本文旨在介绍Redis中的Bitmap操作,并演示如何在PHP中使用这些操作。什么是Bitmap?Bitmap是一种数据

如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音引言:在移动应用开发中,消息推送是必不可少的功能之一。极光推送作为目前较为常用的推送平台之一,提供了丰富的功能来满足开发者的需求。本文将介绍如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音的功能。一、了解极光推送扩展极光推送扩展(JPush)是一款基于PHP语言开发的推送SDK,


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

뜨거운 주제



